公眾號文章匯總
664
2025-03-31
JVM參數示范(基于JDK 1.8)
用如下JVM參數運行代碼:
# 初始新生代大小 5M -XX:NewSize=5242880 # 最大新生代大小 5M -XX:MaxNewSize=5242880 # 初始堆大小 10M -XX:InitialHeapSize=10485760 # 最大堆大小 10M -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8 # 大對象閾值是10MB -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
如何打印JVM GC日志?
GC日志打印選型:
-XX:+PrintGCDetils:打印詳細gc日志 -XX:+PrintGCTimeStamps:這個參數可以打印出來每次GC發生的時間 -Xloggc:gc.log:這個參數可以設置將gc日志寫入一個磁盤文件
加上該參數后,JVM參數如下:
-XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
實例
對象是如何分配在Eden
byte[] array1 = new byte[1024 * 1024];
該行會在JVM Eden內放入一個1M數組,同時在main線程的虛擬機棧壓入一個main方法棧幀,其棧幀內部有一“arr1”變量,該變量指向Eden的那1M數組:
arr1 = new byte[1024 * 1024];
此時會在Eden創建第二個數組,局部變量指向其。然后第一個數組無人引用,成了垃圾:
byte[] array1 = new byte[1024 * 1024];
在Eden創建第三個數組,同時讓arr1指向第三個數組,此時前兩個數組都無人引用,都成了垃圾:
arr1 = null;
arr1啥都不指了,導致之前創建的3數組全部變成垃圾:
byte[] arr2 = new byte[2 * 1024 * 1024];
分配一個2MB大小的數組,嘗試放入Eden,這時Eden放的下嗎?
顯然不行,Eden共4M,已放入3個1M數組,只剩1M,所以這時就會觸發Y-GC。
采用指定JVM參數運行程序
然后運行即可,運行完后,會出現gc.log文件,即本次程序運行的gc日志:
打開gc.log文件,我們會看到如下所示的gc日志:
JVM
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。