本文是《从 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实战高手》内容总结,版权问题,特此声明