透过 Java 参数来改善 Java 效能
作者 : 艾群科技 萧松瀛
我们都知道 Java 在执行的时候会吃掉不少记忆体而当记忆体不够用的时候 JVM 会向系统要求更大的记忆体来使用但是实际上对于 Java 来说我们会发现资料可以存在许多不同的地方其中有两个重要的是 Heap 以及 Stack 这两者有什么差别我们在以后会提到但是在这之前我们先来看一个程式
public class testHeap
{
public static void main(String argv[])
{
StringBuffer sb = new StringBuffer();
long starttime;
long endtime;
starttime = SystemcurrentTimeMillis();
for(int i=; i <=100000; i++)
{
sb.append(i).append("hello").append(i);
if(i % (100000/2) == 0)
{
System.out.println(Runtime.getRuntime().totalMemory());
}
}
endtime = System.currentTimeMillis();
System.out.println("Time: "+(endtime-starttime));
}
}
执行的结果如下
C:\java\tmp> java testHeap
Time:
在这里我们看到 totalMemory 不断的上升当然这是正常现象但
是实际上我们可以控制 JVM 一开始就抓取的记忆体大小这样的好处是
JVM 一开始就抓取了大量的 Heap 怎么做呢? 我们先用 java X 来看
看他有哪些额外的参数可以下没错我看到我感兴趣的几个参数
Xms set initial Java heap size Xmx set maximum Java heap size Xss set java thread stack size 接着我想要让 JVM 一开始就抓取大量的记忆体因此我选择 Xms 这
个参数底下是我的执行结果
C:\java\tmp> java Xms testHeap
Time:
这时候我们看到 total 的记忆体维持不变原因很简单因为 testHeap
使用记忆体的量并没有超过我们一开始抓到的量但是有一个很有趣的现象是循环内的时间已经更短了换一个角度来说就是程式跑起来更有效率这种以记忆体空间来换取执行时间的方式也许并不是最棒的校
调方法但是却是一个在不修改程式码的方式下提高效率的方法当然我们也可以限制记忆体的最大用量参数则为 Xmx 一般说来我并不建议您设定 Xmx 原因很简单因为一旦您设定了 Xmx 那么 JVM 所抓取的记忆体量到了这个值之后便不会再抓取记忆体也就是说您的程式将无法执行我们看看底下的结果
C:\java\tmp> java Xmx testHeap
Exception in thread main javalangOutOfMemoryError
C:\java\tmp>