java GC总结
2020-06-02 11:37:58 73 举报
AI智能生成
垃圾回收的基础知识和java gc整理
作者其他创作
大纲/内容
JVM垃圾回收器
Serial&SerialOld
-XX:+UseSerialGC
YOUNG
复制收集
OLD
标记整理
ParNew
-XX:+UseParNewGC
YOUNG
并发复制收集
OLD(不支持)
默认使用SerialOld收集器收集
CMS
-XX:+UseConcMarkSweepGC
YOUNG(不支持)
默认使用ParNew收集器
OLD
并发标记清理
初始标记(暂停用户线程)
标记GC ROOT关联对象
并发标记(和用户进程并行)
沿着GC ROOT向下遍历对象
重新标记(暂停用户线程)
处理并发标记期间的更新
并发清理(和用户进程并行)
Current Mode Failure
退化成Serial Old收集(暂停用户线程)
特点
低停顿,暂停时间短
会产生内存碎片 CPU占用较高
Parallel Scanvage
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy(可选)
YOUNG
并发的复制收集
OLD
并发标记整理
特点
注重减少垃圾回收时间占程序运行时间的比例(比例低吞吐量大)
可以启用自适应调节GC配置的功能
G1
java gc基本概念
GC分类
FULL GC
对老年代中的对象进行回收
一般当老年代空间不足时发生
YOUNG GC
对新生代对象的回收
暂停线程,移动存活对象到survivior/old区
STW
GC中需要用户线程停止运行,保证标记阶段不会出现数据更改
SafePoint
作用
用户线程到达安全点才开始执行GC(因为在安全点处记录了此刻对象引用的地址信息)
定义
安全点一般是“让程序长时间执行的指令”
方法调用
异常跳转/循环跳转。。
使用
用户线程轮询一个标记,在GC开始时修改这个标记,然后用户线程会主动挂起自己此时已到达安全点
没有获得CPU时间的线程,在GC时通过SafeRegion实现类似功能
分代
新生代
Eden
Survivor
老年代
永久代
方法区的中数据
1.7 hotspot 字符常量等内容被移到堆中
1.8 用元空间代替永久代,元空间使用本地内存
可达性分析
从GC Root出发不可访问到的对象 会被视为不可达
不可达对象会在GC阶段首先被标记
GC ROOT
方法区的常量引用&静态引用
JVM栈中引用的对象
活跃线程&它本地栈中引用的对象
HotSpot OopMap
GC开始前就预先保存了GC Root的引用的内存地址,加快查找速度
JVM内存结构
共享区域
堆
对象
方法区
Class对象
常量池
1.7hotspot 后常量池放在了堆中
私有区域
JVM栈
局部变量表
int,double等基础类型
reference引用
returnAddress字节码指令地址
操作数栈
JNI方法栈
程序计数器
线程执行字节码时的行号指示器
直接内存
JVM引用分类
StrongReference
一般都是强引用
不会被垃圾回收
SoftReference
当内存不足时才被回收
WeakReference
下一次GC就会被回收
PhantomReference
不能通过虚引用获得对象实例
作用仅限于被回收时通知
引用类基类
abstract Reference<T>
ReferenceQueue
ReferenceHandler
gc定义
Garbage Collection
目的
回收已经不再使用的内存,避免内存泄漏,满足程序的内存分配请求
过程
和日常打扫垃圾不同,GC不是标记垃圾,而是标记要保留的内存区域
Garbage定义
程序不再使用的对象/数据/内存区域
分类
语义垃圾 (semantic garbage)
不会再使用的数据,因为不再被引用无法到达或因为程序运行时的代码逻辑导致不会到达
语义垃圾很难自动回收,因为语义垃圾的识别需要进行代码分析,这是一个Undecidable problem
语法垃圾是语义垃圾的子集
语法垃圾(syntactic garbage)
不能再使用的数据,因为引用路径上已无法到达(不再被引用)
语法垃圾的识别,需要进行引用分析,只分析数据不分析代码
语法垃圾可以自动回收,一般垃圾回收都是指语法垃圾
常用回收算法
tracing garbage collection
定义
通过从“root”对象遍历得到所有可达对象,标记它们,然后未标记的即垃圾
分类
Mark Sweep
标记清理(Mark Sweep No-Compat)
标记:遍历内存中的存活对象包括封装在对象里的数据,进行标记
清理:对整个内存中非存活对象进行清理
产生内存碎片
标记整理(Mark Sweep Compat)
标记:遍历内存中的存活对象包括封装在对象里的数据,进行标记
整理:将对象移动到空余的内存空间,因为经过移动,对象间的内存间隙被消除
复制回收器(Mark Copy Collector)
将对象“分代”,适合生命周期短的对象
把存活的对象直接复制到指定区域,存货的对象在不同区域间移动
需要保留足够的内存空间来复制(所以老年代一般不用它)
Tri-color Marking
引用计数(Reference Counting )
计数器记录对象被引用了几次
计数器变成0 对象可以回收
循环引用无法清理
定义
0 条评论
下一页