jvm 垃圾回收机制理解

jvm 垃圾回收机制理解

堆内存区域划分

堆内存被划分为年轻代和老年代两个区域,而年轻代又分为一个伊甸园区(Eden)和两个幸存区(from_Survivor和to_Survivor),年轻代分配比例8:1:1。

##了解垃圾回收机制前我们要先了解下,如何判断对象可用被回收?

将“GC roots”对象作为根节点,从根节点开始向下查找引用对象,直到最后一个节点,找到的对象都标记为非垃圾对象,其余未标记的都是垃圾对象。
线程栈中的本地变量,静态变量,本地方法中的变量都可用作为GC roots根节点, 这就是可达性分析算法。

标记为非垃圾的对象会被复制空的survivor区,对象的分代年龄加1,剩余伊甸园区的垃圾对象会被清除。当伊甸园区域再次满了后会再次触发minor gc。
再次根据可达性分析算法标记非垃圾对象,重复上面的操作。
当长期存活对象(分代年龄达到15)和大对象,将会放到老年区。

对象动态年龄判断

还有当前放对象的Survivor区域里(其中一块区域,放对象的那块s区),一批对象的总大小大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定),那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了,例如Survivor区域里现在有一批对象,年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代。这个规则其实是希望那些可能是长期存活的对象,尽早进入老年代。对象动态年龄判断机制一般是在minor gc之后触发的。

full gc

当老年代满了后,进行一次full gc,老年代依然满着,这时会出OOM内存溢出。
我们调优的目的主要就是减少full gc 次数,以减少STW(Stop the World),STW是指full gc时,会暂停当前执行线程,等待full gc结束,即在full gc期间,JVM虚拟机是暂停的。

注:一般老年代占对内存的2/3.

频繁full gc 如何解决?

能否对jvm调优,让虚拟机几乎不发生full gc,
当系统一次性加载过多数据进内存,导致频繁有大对象进入老年代,触发Full GC。我们可调整伊甸园区(Eden)大小 通过-Xmn 参数调整。具体如何调优还要根据实际情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值