[踩坑日記]JVM學習-GC日志的輸出


近期看完的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的小伙伴有可能看不懂,這是記錄寄幾在學習中遇到的坑,以后遇到,忘記了,再回來回顧~~

 


免責聲明!

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



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