java堆記憶體引數調整
阿新 • • 發佈:2019-01-06
1.java堆記憶體引數
我們為什麼需要進行jvm堆記憶體調整?
因為jvm垃圾回收機制,主要發生在堆記憶體區域,從堆的記憶體結構劃分,裡面存在伸縮區概念,那麼頻發的伸縮會影響jvm效能,所以我們需要去掉伸縮區。只需要-Xms和-Xmx大小相等,即堆記憶體裡面-Xms和-Xmx是比較重要的引數。我們也可以將垃圾回收的日誌打印出來。這時需要-XX:+PrintGCDetails引數。
這裡有兩種方配置引數:命令列(自己百度,這裡不介紹),工具(eclipse,ideal),這裡講ideal的配置
第一步:找到Edit Configurations
第二步:在 vm options 寫上對應的引數
我們如何監控java程式?
開發者:可以在配置引數,打印出日誌,對日誌進行分析。(下面講對日誌如何分析)
運維人員:可以使用jmap和jvisualvm.exe來檢視日誌
接下來看一下如何讓jvm報出OutOfMemory異常來分析日誌?
程式如下:
public static void main(String[] args){ List<String> list = new ArrayList<>(); long i = 0; String string = "aaaaaaa"; while (true) { string = (i++) + ""; string.intern(); list.add(string.intern()); } }
日誌資訊:
分析:
[GC (觸發MinorGC)[PSYoungGen(年輕代複製演算法): 2560K(垃圾回收前年輕代記憶體)->508K(垃圾回收後年輕代記憶體)(3072K(總記憶體))] 2560K(堆記憶體回收前大小)->1062K(堆記憶體回收後大小)(10240K(堆總記憶體)), 0.0020058 secs] [Times: user=0.00(GC使用者耗時) sys=0.00(GC系統耗時), real=0.00 secs(GC實際耗時)]
通過可以上面引數可以計算出往老年代移動的多少物件:(2560-1062)-(2560-508)