一.内存回收战略和常见概念
可以从以下维度理解典型的垃圾收集策略:
1串并行
串行:单线程执行内存回收任务。 它非常简单,不需要考虑同步等问题,但是很费时间,不适合多cpu。
并行处理:多线程化进行复用工作。 适用于多CPU,效率高。
并发停止世界
stop the world:jvm中的APP线程挂起,只有垃圾回收线程正在进行垃圾回收工作。 不需要考虑简单、不能回收干净等问题。
合并:垃圾回收的同时,APP也在跑步。 保证APP的响应时间。 有时无法完全回收而需要二次回收。
3压缩未压缩副本
压缩:进行垃圾回收后,通过滑动,将生存对象滑动到连续空间,清除碎片,保证剩余空间连续。
未压缩:保留碎片,不压缩。
复制:将存活的对象移动到新空间,并释放所有旧空间。 (需要很大的内存。 )
垃圾回收算法可以从以上几个维度来考虑和设计,最终产生具有不同特性适合不同场景的垃圾回收器。
二. JVM的YGCFGC
YGC :对一堆有趣的蜡烛进行GC。 频率很高。 大多数对象的生存寿命很短,所以用有趣的蜡烛世代回收。 性能下降很少。
FGC :所有堆范围的GC。 当默认堆使用量达到80% (可调)时,将触发FGC。 以我们的生产环境为例,一般很少引起FGC,有时十天或一周一次。
三.何时诱发YGC,何时诱发FGC?
YGC的时机:
edn空间不足
FGC定时:
1.old空间不足
2.perm空间不足
3 .显示调用System.gc (包括RMI等)的时序触发器;
4.YGC时的悲观策略
5.dump live的内存信息的情况(jmapdump : live )。
对YGC的触发时机,很明显eden的空间不足,这将触发YGC
关于FGC的触发时机,old领域不足和perm领域不足这一点通过调用system.gc ()可以明确,在这种情况下,一般会触发GC。
最复杂的是所谓的悲观策略,它所触发的机制是先计算晋升的平均幅度,也就是从幽默的烛代到通过ygc幽默的烛代的平均幅度。 而且,如果旧世代的剩馀空间小于晋升的大小,则触发一次全GC。 sdk认为的战略是,从平均和长期的情况来看,下次晋升的空间不充分的可能性非常高。 与其在那之前呆在fullGC,不如悲观地认为下次一定会诱发fullGC,直接执行fullGC。 并经过实际使用,达到了比较稳定的效果。