透過 Java 參數來改善 Java 效能 (艾群科技 蕭松瀛)
作者 : 艾群科技 蕭松瀛
我們都知道, Java 在執行的時候會吃掉不少記憶體,而當記憶體不夠
用的時候, JVM 會向系統要求更大的記憶體來使用。但是實際上對於 Ja
va 來說,我們會發現資料可以存在許多不同的地方,其中有兩個重要的
是 Heap 以及 Stack 。這兩者有什麼差別,我們在以後會提到,但是在
這之前,我們先來看一個程式:
public class testHeap
{
public static void main(String argv[])
{
StringBuffer sb = new StringBuffer();
long starttime;
long endtime;
starttime = System.currentTimeMillis();
for(int i=0; i <=100000; i++)
{
sb.append(i).append("hello").append(i);
if(i % (100000/2) == 0)
{
System.out.println(Runtime.getRuntime().totalMe
mory());
}
}
endtime = System.currentTimeMillis();
System.out.println("Time: "+(endtime-starttim
e));
}
}
執行的結果如下
C:/java/tmp> java testHeap
2031616
5578752
10498048
Time: 651
在這裡,我們看到 totalMemory 不斷的上升,當然,這是正常現象,但
是實際上我們可以控制 JVM 一開始就抓取的記憶體大小,這樣的好處是
JVM 一開始就抓取了大量的 Heap 。怎麼做呢? 我們先用 java -X 來看
看他有哪些額外的參數可以下,沒錯,我看到我感興趣的幾個參數
-Xms <size> set initial Java heap size
-Xmx <size> set maximum Java heap size
-Xss <size> set java thread stack size
接著,我想要讓 JVM 一開始就抓取大量的記憶體,因此我選擇 -Xms 這
個參數,底下是我的執行結果:
C:/java/tmp> java -Xms50000000 testHeap
49741824
49741824
49741824
Time: 480
這時候我們看到 total 的記憶體維持不變,原因很簡單,因為 testHea
p 使用記憶體的量,並沒有超過我們一開始抓到的量。但是有一個很有趣
的現象是迴圈內的時間已經更短了,換一個角度來說,就是程式跑起來更
有效率。這種以記憶體空間來換取執行時間的方式,也許並不是最棒的校
調方法,但是卻是一個在不修改程式碼的方式下,提高效率的方法。當然
,我們也可以限制記憶體的最大用量,參數則為 -Xmx 。一般說來,我並
不建議您設定 -Xmx ,原因很簡單,因為一旦您設定了 -Xmx ,那麼 JVM
所抓取的記憶體量到了這個值之後,便不會再抓取記憶體,也就是說您
的程式將無法執行,我們看看底下的結果
C:/java/tmp> java -Xmx5000000 testHeap
2031616
5578752
Exception in thread "main" java.lang.OutOfMemoryError
C:/java/tmp>