030、JVM实战总结:G1分代回收原理深度图解:为什么回收性能比传统GC更好?

本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明

1、前文回顾

很多Region,新老各自对应一些Region,会在指定的系统停顿时间内,回收价值最大的Region

2、如何设定G1对应的内存大小

-Xms和-Xmx来设置堆内存

-XX:+UseG1GC 使用G1,JVM最多可以有2048个Region

-XX:G1HeapRegionSize 设置每个Region的大小,一般保持默认就可以,Region大小是2的0-5次幂M(1,2,4,8,16,32)。如果手动设置为3,则向下取最大的:2

-XX:G1NewSizePercent 设置新生代初始占比,默认5%。

-XX:G1MaxNewSizePercent 设置新生代最大的占比。默认60%。5%到60%之间的空间是有可能被老年代给占用的。

??疑问:既然空间分配是动态的,设定一个最大占比就可以了,初始占比设置的意义在哪?

    - 初始值是极端情况下新生代的自留地。即老年代极端情况可以占95%。

??问题:使用系统默认值的情况下,新生代内存初始值是5%,最大值是60%,也就是说极端情况下,老年代是可以分配到95%的堆内存的?

    - 极端情况下是的

3、新生代还有Eden和Survivor的概念吗?

新生代里还是有Eden和Survivor的划分,会各自占据不同的Region。也可以使用-XX:SurvivorRatio=8

4、G1的新生代垃圾回收

触发和回收新生代和之前的过程一样。不同点在于:由于MaxGCPauseMills的设定,只会在指定时间内回收掉尽可能多的垃圾对象

5、对象什么时候进入老年代?

进入老年代的条件:1、年龄到了 2、动态年龄判断 ,具体查看https://www.cnblogs.com/csldm/p/11296124.html 3、新生代空间放不下了

6、大对象Region

大于单个Region 50%的属于大对象。直接使用空的Region放大对象。存在大对象情况的情况下,新生代空间+老年代空间 = 堆空间 - 大对象空间

 

7、本文总结

总结:

1、新生代老年代是个逻辑的概念,即同一个Region在系统经历过若干次垃圾回收后,做过新也当过老,也有可能新老都没有作过

2、空间分配的单位是Region

3、虽然新老是个逻辑概念,但他们是有自己的大小上下限的。默认情况下新最大占60%,老最大占1 - 5%的新生代初始值=95%

4、触发和回收新生代和之前的过程一样。不同点在于:由于MaxGCPauseMills的设定,只会在指定时间内回收掉尽可能多的垃圾对象

5、进入老年代的条件:1、年龄大了 2、动态年龄判断 3、存活对象Survivor放不下

6、大于单个Region 50%的属于大对象。

 

思考题:G1最大进步什么?

答:最大进步就是STW可控,但是,虽然各个Region所属区域是动态变化的,但不是随意变化的,还是会为Eden、Survivor、老年代保留各自需要的空间。例如不会让Eden空间的分配超过系统设定的值

 

本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java硕哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值