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為相同的值。
好了,本次簡單的了解就到這里,如果你有什么好的意見或建議,歡迎交流學習!