GC与分代回收算法
GC目的:实现无用对内存自动释放,减少内存碎片、加快分配速度。
GC要点:
- 回收区域:堆内存
- 可达性分析算法、三色标记法
- GC具体实现称垃圾回收器
- GC采用分代回收思想,回收区域分为老年代,新生代。
- GC规模:Minor GC(新生代GC), Mixed GC(混合GC),Full GC(新生代和老年代全面GC)…
分代回收
- 伊甸园eden,最初对象分配。与幸存区合成新生代。
- 幸存区survivor,分为from,to;当伊甸园内存不够,标记复制法标记幸存对象,发生垃圾回收,把幸存对象复制到to区然后from与to交换位置。
- 老年代old,当幸存区对象熬过多次回收(最多15次),晋升到老年代(幸存区内存不足或大对象也会导致提前晋升)。
GC规模
- Minor GC发生新生代的垃圾回收,暂停时间短。
- Mixed GC新生代+老年代部分区域的垃圾回收,G1收集器特有。
- Full GC新生代+老年代完整垃圾回收,暂停时间长,系统卡顿。…
三色标记与并发漏标问题
重新标记
- 增量更新Incremental update:只要发生赋值,被赋值的对象就会被记录。
- 快照Snapshot At The Beginning,SATB:新加对象会被记录,被删除引用关系的对象也被记录。
垃圾回收器
- Parallel GC
- eden 内存不足发生Minor GC,标记赋值STW
- old内存不足发生Full GC ,标记整理STW
- 注重吞吐量
- ConcurrentMarkSweep GC
- old 并发标记,重新标记时需要STW,并发清除。
- Failback Full GC 并发失败
- 注重响应时间
- G1 GC
- 响应时间与吞吐量兼顾。
- 划分出多个区域,每个区域都可以充当eden,survivor,old,humongous(存储大对象)。
- 新生代回收: eden内存不足,标记赋值STW
- 并发标记: old并发标记,重新标记时需要STW
- 混合收集: 并发标记完成,开始混合收集,参与赋值的有eden、survivor、old,其中old会根据暂停时间目标,选择部分回收价值高的区域,复制时STW。
- Failback Full GC
内存溢出
- 误用线程池-----newFixedThreadPool(任务队列爆满),newCacheThreadPool(线程数超出系统大小)
- 一次查询数据量过大----商品模块的商品查询 findAll()。
- 动态生成类的加载器无法回收
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)