JVM-垃圾回收(2)
作者:互联网
回收算法补充——分代回收
实际的JVM并不会单独的使用一种算法,分代回收的垃圾回收机制就体现了这一点。
JVM将堆内存划分为两个区域——新生代 和 老年代
- 新生代使用复制算法
- 老年代使用标记 - 清除 或者 标记 - 整理 算法
而新生代又细分为 伊甸园、幸存区From、幸存区To
新创建的对象放在伊甸园,当伊甸园无法再放入对象时就会产生垃圾回收
新生代的垃圾回收,我们称为 Minor GC
新生代的垃圾回收采用复制的方法,将存活的对象复制到 幸存区To 中
同时让幸存的对象存活次数+1
完成一次 Minor GC 后 幸存区From和幸存区To会交换一次位置(指向发生变化,让幸存区To为空的状态)
当下一次垃圾回收的时候,幸存区的对象也会被判断是否回收
当然,幸存区的对象不会一直呆在幸存区,当其存活次数超过一个阈值(默认 15)他就会被移动到老年代中
老年代的空间也有不足的时候,当新生代无法触发回收,老年代的空间也不足的时候就会产生垃圾回收
老年代的垃圾回收,我们称为 Full GC
老年代使用标记 - 清除 或者 标记 - 整理 算法进行垃圾回收
触发Minor GC和Full GC时会引发Stop the World
意思是在新生代和老年代垃圾回收时,其它用户线程必须停止直到垃圾回收过程完成
相关JVM参数
含义 | 参数 |
---|---|
堆初始大小 | -Xms |
堆最大大小 | -Xmx 或 -XX:MaxHeapsize=size |
新生代大小 | -Xmn 或 (-XX:Newsize=size +-XX:MaxNewSize=size) |
幸存区比例(动态) | -XX: Initial SurvivorRatio=ratio Al -XX:+UseAdaptiveSizePolicy |
幸存区比例 | -XX:SurvivorRatio=ratio |
晋升阈值 | -XX:Max Tentring Threshold-threshold |
晋升大小 | -XX:+PrintTenuringDistribution |
GC详情 | -XX:+PrintGCDetails-verbose:gc |
Full GC 前 Minor GC | -Xx:+ScavengeBeforeFullGC |
垃圾回收器
串行垃圾回收器
- 底层是一个单线程的垃圾回收器
- 适用于堆内存较小和cpu核数较少(个人电脑)的时候
-XX:+UserSerialGC = Serial + SerialOld
吞吐量优先垃圾回收器
- 多线程
- 适用于较大的堆内存,需要多核cpu
- 目的:尽可能让单位时间内STW(Stop the World)时间最短
-XX:+UseParallelGc ~ -XX:+UseParallelOldGC
响应时间优先垃圾回收器
- 多线程
- 适用于较大的堆内存,需要多核cpu
- 目的:尽可能让单次STW(Stop the World)时间最短
- XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld
过程解释:
- 初始标记: 仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
- 并发标记: 进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
- 重新标记: 为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
- 并发清除: 不需要停顿。
在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。
标签:标记,幸存,回收,XX,GC,垃圾,JVM 来源: https://www.cnblogs.com/S2Jgogo/p/16223710.html