JVM 回收原则
HotSpot VM 的实现的 GC 分类:
- Minor GC / Young GC : 新生代收集 : 对新生代 GC
- Major GC / Old GC : 老年代收集 : 对老年代 GC
- Mixed GC : 混合收集 : 对整个新生代和部分老年代 GC
- Full GC : 整堆收集 : 收集整个 Java 堆和方法区
空间分配担保
- 确保 Minor GC 前 , 老年代能放新生代所有对象的剩余空间
- JDK 6 后的规则 : 只要老年代的连续空间 > 新生代对象总大小或历次晋升的平均大小,就会 Minor GC,否则就 Full GC
对象优先在新生代 Eden 区分配
- 当 Eden 区没有空间时,就进行 Minor GC
大对象直接进入老年代
- 大对象 : 要大量连续内存空间的对象(如:字符串、数组)
- 避免大对象分配内存时 , 由于分配担保机制的复制 , 而降低效率
长期存活对象进入老年代 :
- 当对象在 Eden 经过 Minor GC 后 , 能放入 Survivor (s0 或 s1),并将对象年龄 = 1
- Survivor 每 MinorGC , 年龄 + 1 ,当年龄到 (默认 :
-XX:MaxTenuringThreshold = 15
),就进入老年代中
young gc stw :
- GC , 都会 stop-the-world,只是时间长短
- Serial、PartNew、Parallel Scavenge 都会挂起用户线程
- CMS 和 G1 在并发标记时,不会挂起用户线程,但其它时候也会挂起用户线程,stop the world 相对较小
major gc/ full gc 区别 :
- 一般区分 Minor GC/ Full GC
- Full GC 会对年轻代、老年代、元空间、堆外内存回收
Full GC 原因:
- 当年轻代晋升大小,比老年代剩余的空间大时,会触发 Full GC
- 当老年代的空间使用率 > 某阈值时,会触发 Full GC
- 当元空间不足时,会触发 Full GC
- 调用
System.gc()
, 会 Full GC