gc浅了解

GC 过程

以java官方的HotSpot JVM为例

首先了解堆内存的结构 新生代(伊甸园区,两个幸存区S0,S1)、老年代、永久代 注:JDK1.8以后 永久代去掉了,取而代之的为元数据区Metaspace,其使用的是本地内存

gc全过程

1、新创建对象分配到Eden区,两个幸存区为空

2、Eden区达到容量阈值,新生代发生垃圾回收,称为 Minor GC 或 Young GC

3、通过可达性分析算法找到可达对象,被标识的可达对象转移到S0(此时为From Survivor),存活对象年龄加1,清除Eden所有对象 注:可达性分析算法称为根搜索算法,gc定义了一些根,从根开始不断搜索,能够被引用的对象就不是垃圾,不能被引用的就是垃圾。gc roots(虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象)

4、Eden再次达到阈值,再次GC,通过可达性分析算法找到的可达对象转移到S1(To Survivor),存活年龄加1,清除Eden和S0中所有对象

5、S0 S1角色互换 S0 为To Survivor,即 To Survivor永远为空(是垃圾回收算法在年轻代的实际应用) 注:很多年轻代垃圾收集器都用复制算法,如ParNew。因为新生代可达对象少,不超过10%,所以搜寻和复制的成本低,并且该复制方法还能避免产生堆内存碎片,提高内存利用率

6、存活年龄不断增加,达到上限会被晋升到老年代,默认15

7、其他晋升方式(大对象直接晋升(避免在年轻代里频繁复制)、动态年龄对象判定)

8、老年代垃圾回收,并不是全局GC,老年代空间是年轻代几倍且老年代对象的存活率高,所以标记过程慢,gc成本高,jvm调优为了减少老年代的时间和频次。 基本不使用复制算法,一般采用标记清除、标记整理算法、就地标记回收。CMS采用标记清除算法,至于内存碎片问题,CMS提供两个参数做碎片整理。

#在找工作求抱抱#
全部评论

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务