1. 程式人生 > >根據應用程式設定JVM引數(一)-設定堆、新生代、老年代、持久代大小

根據應用程式設定JVM引數(一)-設定堆、新生代、老年代、持久代大小

一、根據程式的執行狀況檢視其活躍的資料量

①、活躍的資料:

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效能優化權威指南》