房屋设计网站推荐,题库网站建设的绩效指标,根据网站集约化建设要求,网站建设在整体布局有哪些要求#xff08;1#xff09;G1_FullGC的概念辨析 SerialGC#xff1a;串行的#xff0c;ParallelGC#xff1a;并行的 #xff0c;CMS和G1都是并发的
这几种垃圾回收器的新生代回收机制时相同的#xff0c;SerialGC和ParalledGC#xff1a;老年代内存不足触发的叫FullGC…1G1_FullGC的概念辨析 SerialGC串行的ParallelGC并行的 CMS和G1都是并发的
这几种垃圾回收器的新生代回收机制时相同的SerialGC和ParalledGC老年代内存不足触发的叫FullGC
CMS和G1老年代的内存不足分两种情况以G1垃圾回收器为例它本来是没有Full GC的但是
G1垃圾回收器内存不足时有一个阈值当你的老年代内存跟整个堆内存占比达到45%以上的时候 触发并发标记阶段和混合收集的阶段这两个阶段当你的回收速度高于新的用户线程产生的垃圾的时候回收的速度快于产生的垃圾速度的时候这个时候还不叫Full GC还出于并发垃圾收集阶段
当垃圾的回收速度跟不上垃圾的产生速度的时候这个时候并发收集就是失败了就会退化为串行的收集这个时候就叫Full GC了并发失败了就叫Full GC可以在GC日志里面查看是否有Full GC 字样
2G1_新生代_跨代引用
新生代垃圾回首先找到根对象根对象可达性分析找存活的对象存活对象进行一个复制到幸存区有一个问题根对象有一部分来自老年代的老年代存活对象非常的多如果我们去遍历整个老年代去找根对象效率也是非常的低的采用的是一种卡表的技术把老年的技术再进行一个细分分成一个个Cart每个大约512k如果有一个对象引用了新生代的对象那么对应的Cart标记为脏Card这样的好处是将来我们不用去找整个老年代了只需要关注哪些脏Cart的对象了脏Cart的区域减少搜索范围提高效率 新生代这边会有一个Rememberd Set可以记录对外部对我的引用记录有哪些脏Cart将来对新生代做垃圾回收的时候通过Remembered Set知道有哪些脏Cart然后再到这个脏Cart区域遍历这些Root对象
标记脏Cart需要通过post-write barrier写屏障当每次对象发生变更时去更新这个脏Cart是一个异步操作可能不会立刻更新 会把更新的指令放到脏Cart的一个队列当中dirty cart queue将来由一个线程完成脏Cart的更新操作 3G1_remark
下面学习重标记的知识
在CMS和G1垃圾回收器的时候有这么两个阶段并发标记跟重新标记阶段
下面是并发标记阶段时的对象的一个处理状态黑色的表示已经处理完成的有引用子在引用它的黑的的表示在结束时被保留下来存活下来的对象
灰色正在处理当中的
白色尚未处理的
灰色的如果有人在强引用它将来会变为黑色的后面的那个白色最后也会变成黑色存下来上面的白色没有引用将来还是白色
垃圾结束时会根据黑白状态来区分应该存活还是应该当成垃圾 下面当处理到B发现有强引用把它变为黑色 处理到C并发表标记此时有用户的线程对这个对象的引用做一个修改比如把这个引用断了当处理完B处理C发现它的引用已经断了处理到C的时候说C是白色的 还有另外一种情况可能当C被处理完以后并发标记没有结束用户线程改变了C的引用地址把C对象作为A对象的一个属性做一个赋值操作 因为A处理完了此时如果把C回收掉是不行的因为有强引用它需要做进一步检查重标记
当这个对象的引用发生改变时JVM会给他加入一个写屏障会把C加入一个队列把C变为一个灰色表示还没有处理完 当整个并发标记结束了进入重新标记阶段重新标记阶段会Stop the World重新标记的线程从队列中把一个个取出来发现有强引用引用着它把它变为黑色这样呢不会被错误当错垃圾回收掉
4G1_字符串去重 下面介绍G1垃圾回收器的优化介绍的是jdk8-jdk9的优化 跟String.intern不一样它关注的是char数组而String.intern关注的是字符串对象是让字符串本身不重复用的是StringTable来去重
5G1_类卸载
jdk之前的版本中类是没有办法卸载的只要加载后会一直占用内存 尤其自定义的类加载器 创建和加载类使用一段时间后就没有人再用了这个时候还占用的内存对垃圾回收时不利的从jdk8u40后 类卸载的条件比较苛刻类的实例都被回收掉了类所在的类加载器其中的所有类也不再使用了就会把所有类卸载掉
对很多框架来说都是用了自定义的类加载器这种情况还是会发生的 JDK的类加载器他们加载的类一般不会卸载比如启动类加载器扩展类加载器应用程序类加载器他们使用都是会存在的不会被卸载 6G1_巨型对象
G1垃圾回收器的区划分伊甸园区幸存区老年代区还有一种巨型对象区 巨型对象的回收时是不会对对象进行拷贝回收时会优先回收 7G1_动态调整阈值 在现在的G1垃圾回收器老年代即使是Full GC也变成了多线程
Full GC是影响效率可以减少Full GC的几率通过上面参数设定
当老年代跟堆内存占比超过阈值时并发得垃圾回收就开始了阈值默认是45% jdk9以后把这个固定了 就不太好了定义的大了容易产生Full GC,定义的下了频繁的进行并发标记和混合收集
jdk9里可以动态的调整这个阈值通过下面的参数来设定
它会添加一个安全的空挡空间让堆得空间足够大容纳哪些浮动的垃圾这样呢可以避免并发垃圾回收退回到Full GC