- 对象的分配和回收
- java对象优先分配在Eden区和一个Survivor区(Eden和Survivor的比例可以配置,比如8:1),当Eden区和Survivor区内存不够对象分配时,触发一次MinorGC,将Eden区和Survivor区中存活的对象移入到另一个Survivor区,并将Eden和Survivor进行回收。
- 如果另一个Survivor区不够装入存活的对象时,使用分配担保策略将这些对象存入老年代。
- java大对象直接分配到老年代。长字符串或者大数组这类大对象会在超过设定的阈值后直接存入老年代,避免其在Eden区频繁地引发Minor GC,来回复制。
- 上图 s1 和 s2 同时只会用其中一个块,假如Eden+s1 进行MinorGc ,存活下的进入s2 , 下次Eden+s2 进行MinorGc ,进入s1。
- 这里有一概念叫做年龄阈值,每个对象定义了年龄计数器,经过一次 Minor GC (在交换区)后年龄加1,对象年龄达到15次后将会晋升到老年代,老年代空间不够时进行 Full GC。
2. JVM完整的GC流程
对象的正常流程:Eden 区 -> Survivor 区 -> 老年代。
新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍,JVM 会“stop the world”,严重影响性能。
【总结】:内存区域不够用了,就会引发GC。Minor GC 避免不了,Full GC 尽量避免。
【处理方式】:保存堆栈快照日志、分析内存泄漏、调整内存设置控制垃圾回收频率,选择合适的垃圾回收器等。