jdk1.8的jvm參數的查看以及GC日志的分析


JVM 默認參數查看
1、安裝完Java環境后,我們可以通過下面這個命令查看系統默認的jvm參數
運行cmd
命令:java -XX:+PrintFlagsFinal
我們可以看到默認jvm的主要參數如下:

從上面的信息,我們可以找到我們經常設置的信息(本機物理內存是8G):

-Xmx:最大堆內存(默認為物理內存的1/4),圖上對應可以看出 MaxHeapSize=2109734912(約2G,即為物理內存的1/4)

-XX: MaxMetaspaceSize:   這個是jdk1.8新的參數,用來代替以前的MaxPermSize(持久代大小),

-XX: MaxNewSize: 最大新生帶大小 ,圖上可以看出最大的 MaxNewSize=703070208(約700M)

-XX: NewSize: 初始的年輕代大小,圖上可以看出最大的 NewSize=44040192(約40M)

-XX: NewRation: 表示年輕代與年老代所占比值為,圖上可以看出2,即就是年輕代與年老代為1/2,也就是年輕代為堆內存的1/3,用最大內存2g來看,最大年輕代為700M,和上面的信息也是對應一致的

-XX: SurvivorRatio:標識Eden區與Survivor區的大小比值,默認值8,由於Survivor是由兩個大小相同的區域組成,那么即就是兩個Survivor與Eden的比值為2:8,也就是一個Survivor區占整個年輕代的1/10,Eden區占整個新生代的8/10

對於一般的生產環境而言,默認的JVM參數基本就可以了,如果需要調整可以根據自身的環境進行調整,比如我自己的本地環境的jvm參數:

 

-Xms2G -Xmx2G -Xmn256m -Xss256k

因為我是java web項目,且請求次數多,但是請求體不大,因此考慮將新生代的內存設置的小一點,保證請求能夠在結束后,如果需要GC,最好直接在年輕代GC,不要過渡到老年代,從而引發FullGC(但是參數一定要自己試一試,不要頻發的引發yong gc)


 


 


 

 

GC日志查看分析

由於gc收集器的不一樣,因此打印出來的日志也不一樣,下面我以自己本地默認的收集器為例,看一看一個FullGC的日志信息

查看本地默認的收集器:

使用cmd 輸入:java -XX:+PrintCommandLineFlags -version

 

 

 可以看出我的收集器默認為:-XX:+UseParallelGC:即為並行收集器

[Full GC (Ergonomics) [PSYoungGen: 14841K->13410K(227840K)] [ParOldGen: 20967K->21980K(38400K)] 35809K->35390K(266240K), [Metaspace: 5155K->5155K(1056768K)], 0.0281768 secs] [Times: user=0.19 sys=0.02, real=0.03 secs]

其中 PSYoungGen  表示發生GC時,yong的內存由占用14841K回收到占用13410K  括號后的227840K 表示總的年輕代內存大小

ParOldGen 表示發生GC的時候老年代內存的釋放情況

35809K->35390K(266240K),  這個數值表示的發生GC的時候,整個堆內存的變換情況

而最主要的是Ergonomics這個GC的情況,具體原因可以參考https://blog.csdn.net/weixin_43194122/article/details/91526740

 

很多人可能發現了我的PSYoungGen和ParOldGen的內存,差別比較大,主要原因是本次調試過程中我沒有設置-Xms參數,而是由系統自動分配的,這樣也會導致每次GC后,內存的重新分配,因此建議在生產環境中設置-Xms和-Xmx為相同的值。

 

 

好了,本次簡單的了解就到這里,如果你有什么好的意見或建議,歡迎交流學習!

 

 

 

 



 


免責聲明!

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



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