Jvm理论与实战-GC算法和收集器以及内存模型
- 内存模型
方法区: - 垃圾收集器
垃圾收集过程是按对象年龄,使用多种收集器分代收集的 ,例如 parallel scavenge 、cms、G1等收集器,现一一做说明:
parallel scavenge (默认新生代并行收集器)
复制算法 (并行) 用户线程会停顿 线程是并行执行收集垃圾的
注重吞吐量=执行用户代码时间/执行用户代码时间
相关常用jvm命令
-XX:MaxGCPauseMills 停顿时间
-XX:GCTimeRatio 吞吐量大小(0,100)
-XX:SurvivorRatio=8 (8:1:1) 幸存区比例
-Xmn80M 年轻代内存大小
对象很大
-XX:PretenureSizeThreshold=3145728 3M
长期存活的对象
-XX:MaxTenuringThreshold=15
年轻代为什么会采用复制算法?
年轻代采用复制算法是一种空间换时间的算法, 年轻代空间对象是死亡很快的对象,效率很高,采用复制算法 eden->s1->s2 可以很快完成垃圾收集过程,而标记清除算法既要标记存活对象,第二步还要清除无引用关系对象,比较耗时,适合老年代对象收集.
cms 并发收集器(老年代收集器)
用户线程和gc线程是交替工作,注重低延时,低停顿 ,产生否动垃圾, 占用cpu资源 ,出现concurent mode failure 收集过程中新生代晋升老年代可能装不下:
相关命令:
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction 执行多少次不压缩FullGC后 来一次带压缩的 0 表示每次都压
-XX:+UseConcMarkSweep
G1收集器(带压缩算法的分代收集器,效率很高)
并行与并发同时进行,具有分代收集,空间整合,可预测停顿等优势
相关命令
-XX:+UseG1GC
- 相关问题
什么条件触发STW的Full GC呢?
1 Perm空间不足;
2 CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
(promontion faild产生的原因是EDEN空间不足的情况下将EDEN与From survivor中的存活对象存入To survivor区时,To survivor区的空间不足,再次晋升到old gen区,而old gen区内存也不够的情况下产生了promontion faild从而导致full gc )