根據應用程式設定JVM引數(一)-設定堆、新生代、老年代、持久代大小
阿新 • • 發佈:2019-02-03
一、根據程式的執行狀況檢視其活躍的資料量
①、活躍的資料:
1.應用程式運行於穩定狀態時,老年代佔用的java堆大小
2.應用程式運行於穩定狀態時,永久代佔用的java堆大小
其實就是FullGc後這2個數據的大小
②、動手測試:
1.測試程式碼:
public class A { int[] storage = new int[102400]; int[] extra = new int[200000]; public int[] execute() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return storage; } }
import java.util.LinkedList; import java.util.Queue; public class Test { public static void main(String[] args) { Queue<int[]> queue = new LinkedList<int[]>(); while (true) { int[] tmp=new A().execute(); if (queue.size() > 1000) { queue.poll(); } else { queue.offer(tmp); } } } }
2.引數配置:
3.測試的結果
4.結果分析
可以看到老年代的大小為404211K,持久代的大小為8888K
二、通過活躍的資料配置堆以及其他引數
通用法則1:
將java堆的初始值-Xms和最大值-Xmx設定為老年代活躍資料大小的3~4倍
所以此處就設定 -Xms1600m,-Xmx1600m
在以上的測試結果中可以看到原始的堆大小為1675m左右,是比較接近的。
通用法則2:
永久帶的初始值-XX:PermSize及最大值-XX:MaxPermSize應該比永久代活躍資料大1.2~1.5倍
所以此處就設定-XX:PermSize=13m,-XX:MaxPermSize=13m
補充法則:
新生代空間應該為老年代空間活躍資料的1~1.5倍
此處老年代為400m,新生代就為600m
如果java堆的初始值及最大值為活躍資料的3~4倍,新生代為活躍資料的1~1.5倍時,老年代應設定為活躍資料大小的2~3倍
三、參考表
參考:《java效能優化權威指南》