近期看完的JVM一些基礎學習之后,由於工作中確實沒有多少JVM調優的實戰,生產環境的條件其實並發並不高,大部分情況是默認JVM參數。
在本機win10下,基於JDK1.8.0_161,來測試
所以就自己實驗,體驗一下JVM參數的實戰魅力...
這幾天遇到的坑:
實驗代碼:
1 public static void main(String[] args) { 2 byte[] array1 = new byte[4 * 1024 * 1024]; 3 array1 = null; 4 byte[] array2 = new byte[2 * 1024 * 1024]; 5 byte[] array3 = new byte[2 * 1024 * 1024]; 6 byte[] array4 = new byte[2 * 1024 * 1024]; 7 byte[] array5 = new byte[128 * 1024]; 8 byte[] array6 = new byte[2 * 1024 * 1024]; 9 }
JVM參數:
1 -XX:NewSize=10485760 2 -XX:MaxNewSize=10485760 3 -XX:InitialHeapSize=20971520 4 -XX:MaxHeapSize=20971520 5 -XX:SurvivorRatio=8 6 -XX:MaxTenuringThreshold=15 7 -XX:PretenureSizeThreshold=3145728 8 -XX:+UseParNewGC 9 -XX:+UseConcMarkSweepGC 10 -XX:+PrintGCDetails 11 -XX:+PrintGCTimeStamps 12 -Xloggc:gc3.log
簡單說明:
JVM參數說:
剩下幾個不在圖中的比較簡單:
-XX:+UseParNewGC 使用ParNew垃圾回收器
-XX:+UseConcMarkSweepGC 使用CMS垃圾回收器
-XX:+PrintGCDetails 打印詳細的GC日志
-XX:+PrintGCTimeStamps 打印出來每次GC發生的時間
-Xloggc:gc3.log 設置將GC日志寫入一個磁盤文件
然后是代碼的逐行分析:
上面是正確的分析情況
————————————————分割線————————————————
下面是遇到的坑:
而在IDEA中會出現:
勉強分析也是可以知道執行了CMS垃圾回收器,還把CMS的幾個階段答應出來了:
初始標記,並發標記,重新標記,並發回收。這里面估計是因為IDEA編譯器內部的機制,導致這些信息都打印出來了,而且還影響分析,
第二十行看到新生代from Survivor區還有一堆不明對象存在,更難分析了。。。(IDEA編譯器內部的機制導致!)
最好還是使用命令執行,更新加精准,更少不可控因素:
第二坑:
編譯時候記住記住把:package com.***.***.***;去掉!
雖然 在編譯器中會報錯,但是用命令編譯就沒問題的!不然無法執行命令
沒有去掉package的情況:
去掉package的情況;
打開同級目錄可以看到:
gc3.log文件!!!
和理論分析幾乎完美契合!
沒有學習過JVM的小伙伴有可能看不懂,這是記錄寄幾在學習中遇到的坑,以后遇到,忘記了,再回來回顧~~