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