jvm系列之-gc日志查看


在上一篇中我們介紹的有參數的設置,那我們要了解不同的參數對於程序的影響和對於調優的影響,這個時候我們就需要查看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

image.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
image.png
我們可以看到,在 before gc前,對象都存在於eden區,
image.png
在 after gc之后,我們可以看到,一部分對象存在於from區了,說明我們的調整是有效的

下一篇我們將會討論一下jvm的垃圾回收機制,這一篇估計會比較麻煩 ,但是閱讀垃圾回收的策略,你會發現其實挺好玩的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM