JVM垃圾回收流程

想到哪写到哪里,图片有时间补,嘻嘻!有问题欢迎大家指出哦!

jdk1.8
年轻代分为end区、s1区、s2区,比例为8:1:1
老年代为old区 老年代和年轻代的比例是2:1

jvm垃圾回收机制:(jvm垃圾回收机制主要回收堆区(堆区中主要存放对象的实例)和方法区(存放对象的元信息))
当end区存满之后,
1.首先判断老年代的剩余空间是否大于end区的所有对象的大小
如果大于 直接发生youngGc
小于 判断jvm是否设置了空间分配担保参数
没有配置直接发生 young gc
配置了判断老年代剩余的空间大小是否大于每次young gc后 向老年代保存对象的平均大小
大于 发生young gc
小于 发生full gc 再发生young gc

2.end区发生young gc的时候,将end区的非垃圾对象放入s0区,end区的垃圾对象就会被回收,此时s0区的对象分代年龄+1
当end区的对象再存满时,此时就会将end区和s0区的非垃圾对象放入S1区,end区和s0区的垃圾对象就会被回收,s0区存放进S1区的对象,分代年龄+1为2,新存放进end区新存放进s1区的对象分代年龄为1
一直这样存放数据,有对象的分代年龄为15,还没有被回收,那么此对象就会被放入老年代

3.当老年代也存满之后,就会发生fulL gc,如果发现老年代没有什么可以回收的对象,JVM就会发生OOM(内存溢出)

对象的分代年龄时15被放入老年代并不是绝对的,不同的垃圾回收器回收对象到老年代的分代年龄时不一样的,最大是15,cms垃圾回收器是6
分代年龄是可以通过JVM的参数设置: -XX:MAXTenuringThreshold设置

什么时候设置分代年龄?
当对应用程序中的对象整体进行预估,判断程序中的对象存活次数,加入是5次,我们就可以将分代年龄参数设置为7次就回收到老年代

大对象会被直接放入老年代
什么是大对象?
需要连续的大量连续存储空间的元素 例如:数组、字符串

大对象的大小可以使用jvm参数 --XX:PretenureSizeThreshold设置,如果超过了设置的大小,这个对象直接会进入老年代。这个参数只在Serial和ParNew两个收集器下有效

为什么要这么做?
为了避免为大对象的分配内存时的复制操作而降低效率


对象动态年龄分配机制:
通过设置jvm参数TargetSurvivorRatio,判断当survivor的对象内存大小大于survivor区的50%,在发生young gc之后,会将survivor区分代年龄为n(分代年龄大于等于1)的对象移动到老年代

 

posted @ 2021-04-15 15:04  小菜鸟儿的学习笔记  阅读(412)  评论(0)    收藏  举报