java gc
上一篇写的很难受,思路和描述都感觉很差,这篇改进下,我一直在想是不是两个合一起比较好,算了开始学习分析;
GC根据回收内存类型不同,分为两类yangGC和fullGC,我从几个方面去介绍他们的不同;
yangGC
-
概念及定义
当堆的年轻代满了就会触发yanGC,回收伊甸区及survivor区的垃圾内存;特点是触发频率较高,消耗时间较少,会STW但是由于时间较短,一般不是优化的主要考虑方面
-
gc算法
一般使用标记复制算法;即将内存分为两部分,一部位为空的,另一部分为使用的;然后使用可达性算法标记存活的对象,依次复制到空的那边,复制完成后将之前使用的部分清理;保证有一半空的下次可以使用;
算法优点:速度快,效率高,完成后内存块有序;
缺点:浪费内存,需要保证至少有一半是空的;
-
垃圾收集器
古早使用的是Serial特点是单线程,优点是简单且在单线程下效率高;缺点是当前多核的情况下是浪费资源,可以多线程同时运行还使用单线程进行处理;
然后是早些时候使用的parallel,是serial的多线程版本,提升了效率;
近些时候大多使用parnew,和parallel差不多,特点是可以和cms配合;
fullGC
-
概念及定义
当老年代满了就会触发fullGC;特点是频率低但是耗时较长,由于GC会STW导致影响用户体验,所以jvm一个优化的关键点就是他;如果频繁fullGC就是有问题的;
-
gc算法
一般使用标记清除算法或标记整理算法,根据对应的垃圾收集器来;
标记清除算法是标记失效的对象,然后清理他们;缺点失效对象较多的情况下效率较低,清理完成后空间无序有较多内存碎片;优点:无需多余空的空间;
标记复制算法是标记有效的对象,将他们移到内存一端,然后清理其他地方;缺点效率更低;优点:无需多余空间,清理完成后内存有序,无内存碎片;
-
垃圾收集器
配套Serial的Serial-old;
配套parallel的parallel-old;
配套parnew的cms,cms的特点是并发处理减少stw时间,jdk1.8的很多是使用这个方式的
特殊的g1
现在新版本的jdk17推荐使用的是,g1后面还有更加新的zgc等,g1相对于之前的主要是分区处理,以region为单位,老年区年轻代不再是连续的一块内存,而是分在不同的区中,在每次gc后区都可能变化;特点是g1对大对象做了特殊除了,大对象单独放置在humongous中;
g1在传统的yangGC和fullGC外还增加了mixedGC,分别介绍下;
-
yangGC
现在不再是伊甸区满了触发,而是依赖于一个参数-xx MaxGCPauseMills,指定gc预定消耗时间,这也是g1的特点,指定每次gc的预计消耗时间,算法会计算这么多时间大概能回收多少区,然后对他们进行回收;那么yangGC的触发也就很清晰了,他会计算现有伊甸区的GC耗时是否到达配置值,如果到达就触发yangGC,没到达但是伊甸区满了就会分配更多的区到伊甸区知道需要消耗的时间满足触发yangGC;
-
mixedGC
mixedGC是在老年代的内存使用占比到达一个阈值后触发,触发后使用复制算法进行垃圾对象的清理;阈值也是个jvm参数-XX:G1MixedGCLiveThresholdPercent;因为要使用复制算法,所以需要有空余空间;如果空余空间放不下所有存活的对象,就会触发fullgc;
-
fullGC
fullGC会使用单线程的垃圾回收机制,STW时间长,非常影响用户体验,需要避免;
对象有效性标记算法:三色标记法
更多推荐
所有评论(0)