在上一篇中我们介绍的有参数的设置,那我们要了解不同的参数对于程序的影响和对于调优的影响,这个时候我们就需要查看gc日志来看我们设置的参数是否合理,这一章节中我们就来查看gc日志
一、新生代和老年代的比值对性能的影响
Map map = new HashMap<>();
for (int i = 0; i < 10; i++) {
byte[] b = new byte[1024*1024];
map.put(i,b);
}
System.out.println(map);
-Xmx10M -Xms10M -verbose:gc -XX:+PrintGCDetail -XX:PrintHeapAtGC -Xloggc:ggc.log
![](https://img.haomeiwen.com/i5987246/6a69f984600fdbde.png)
-
1、我们首先来看一个问题:yong = eden+survivor from + survivor to的,但是 2048+512+512 > 2560
解释如下:新生代的可用空间:eden+survivor from,是的 to不属于可用空间,在一次MinorGC之后,eden和from中还活着的对象会被全部复制到to中,然后from和to的角色互换,即可用空间只是eden+from
-
2、第二个问题,我们可以看到在 before gc前,from和to都是 0%,而old区则为85%,为何新生代的from和to都是0%呢?
解释如下:我们每次产生的对象的大小都是1m的对象,当对象过大时,会直接进入老年代
- 3、有很多的博文都是介绍XX:SurvivorRation的默认值为8,我的上一篇博文中也是这样来写的,但是我们可以看到这里的比值很显然不是8,
解释如下:在我们不断上调Xmx和Xms的时候,这个比值近似8
针对问题2,我们现在做一些改动,现在只是生成10M大小的对象,单个对象的大小是1M,显然我们是需要调整Xmn和SurvivorRation的比例的
二、设置Xmn和SurvivorRation的比值
-Xmx10M -Xms10M -Xmn6M -XX:SurvivorRatio=4 -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:gcc.log
即:堆区20m ,新生代6M,Eden:surviror = 4 ,即eden=4096:from=1024:to=1024
![](https://img.haomeiwen.com/i5987246/2d47af53d22e0abb.png)
我们可以看到,在 before gc前,对象都存在于eden区,
![](https://img.haomeiwen.com/i5987246/ecb6b04c42a11f56.png)
在 after gc之后,我们可以看到,一部分对象存在于from区了,说明我们的调整是有效的
下一篇我们将会讨论一下jvm的垃圾回收机制,这一篇估计会比较麻烦 ,但是阅读垃圾回收的策略,你会发现其实挺好玩的
网友评论