JVM垃圾分代收集理论


本章主要介绍下jvm的垃圾分代收集理论,jvm在cms之前的收集都是基于年轻代、老年代内存进行垃圾收集,其中年轻代分为eden区、s1区、s2区,老年代为old区,故堆内存主要分为eden、s1、s2、old区,eden:s1:s2的默认内存比为8:1:1,old区的内存=堆内存-eden-s1-s2内存,其默认分代年龄为15。

对象存储规则

在这里插入图片描述1)新对象进来首先进入eden区,当eden区放满时,触发young gc或叫minor gc,也就是只对年轻代做垃圾收集,将eden区的非垃圾对象放到s1区,标记的分代年龄+1;
2)当后续对象进入eden区又放满时,触发young gc,将eden区非垃圾对象+s1区非垃圾对象放入s2区,标记的分代年龄+1;
3)当后续对象进入eden区又放满时,触发young gc,将eden区非垃圾对象+s2区非垃圾对象放入s1区,标记的分代年龄+1,在分代年龄标记<设置的分代年龄(默认15),存活对象会在eden、s1、s2区循环复制移动;
4)当在进行young gc的分代年龄达到设置的分代年龄时,会将存活的对象放入old区,也就是老年代;
5)当old区的内存达到临界值时,会触发full gc,即对整个堆内存做垃圾收集处理;
当然会存在当年轻代的分代年龄没有达到分代年龄的设置值就会进入老年代的机制。

对象动态年龄判断

当一批对象需要进入到s1或s2区时,会判断这批对象的总大小是否大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定),如果大于,则会将年龄大的对象直接放入到old区,例如:年龄1+年龄2+年龄3+年龄4对象总和大于s1或s2区的50%,那么从年龄4对象之后的对象都进入到老年代中,即年龄4、年龄5、……年龄n都放入老年代;

大对象可能直接进入到老年区

大对象就是需要连续空间的对象,例如进来List里面有很多user对象,若年轻代分配的内存比较小,但出现了一次进入大对象的的情况,可能年轻代放不下,直接存入到老年代中,JVM参数 -XX:PretenureSizeThreshold可以设置大对象大小,如果对象超过这个值直接进入老年区;

老年代空间分配担保机制

在年轻代做young gc之前都会计算下老年代的可用空间大小,若年轻代中的对象大小大于老年代的可用空间,则会查看“-XX:-HandlePromotionFailure”(jdk1.8默认设置)的参数是否设置了,如果设置了,则会计算老年代的可用空间大小是否大于之前每次做young gc后进入老年代的对象的平均值。
若这个参数没有设置或老年代可用空间小于每次做young gc后进入老年代的对象的平均值,就会触发full gc,对老年代和年轻代的内存区域做一次垃圾回收,若回收完还是没有足够空间,则会发生OOM(OutOfMemory)
若young gc后进入老年代的对象大于老年代的可用空间,也会触发full gc,full gc结束后还是没有足够空间,也会发生OOM
在这里插入图片描述

对象内存回收判断

1)引用计数法(jvm未使用)
给对象设置引用计数器,当对象被引用时,计数器+1,当引用失效时,计数器-1,当计数器为0时即是对象不可能被使用。这个方法虽然简单,但存在一定问题即是对象直接循引用的问题造成计数器不为0,故垃圾回收器回收不了这种情况,例如:
o1.filed=o2;o2.filed=o1;o1=null;o2=null;
2)可达性分析法(目前jvm使用)
将Gc root作为根节点,从根节点开始向下搜索引用的对象,能找到的对象都是存活对象,其余的都是垃圾对象。Gc root根节点包含:线程栈的本地变量、静态变量、本地方法栈的变量等等,也就是线程使用的变量;
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

JVM常用参数

1)-Xmx:2048M 设置堆内存最大值
2)–Xmn:1024M 设置年轻代内存值
3)-Xms:2048M设置堆内存初始值
4)-XX:MaxTenuringThreshold=8 设置分代年龄阈值,cms收集器默认6
5)-XX:PretenureSizeThreshold=100000 (单位字节) 设置大对象的大小,当对象大小超过此值,直接进入老年代
6)-XX:NewSize=1024M:设置新生代初始大小
7)-XX:NewRatio=2:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。
8)-XX:SurvivorRatio=6 设置年轻代eden:s1:s2的比值,若为6,即是6:1:1
9)-XX:-HandlePromotionFailure 老年代空间分配担保
10)–XX:MetaspaceSize=512M 设置方法区(元空间)初始值
11)–XX:MaxMetaspaceSize=512M设置方法区(元空间)最大值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值