我有以下Java程序,我不希望需要多少Java堆:
public class SleepTest {
public static void main(String[] args) {
while (true) {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
}
}
}
}
因此,我尝试通过使用Xms
设置指定初始堆大小来通知JVM。但是,似乎JVM忽略了这一点,并使用默认大小进行分配。这是为什么?
为了说明我开始我的计划三次:
abc@yyy:~> java SleepTest & // default - 512 MB
[1] 15745
abc@yyy:~> java -Xms10M SleepTest & // specifying initial size of 10 MB
[2] 15756
abc@yyy:~> java -Xmx10M SleepTest & // forcing max heap size of 10 MB
[3] 15766
调查Linux中的内存消耗:
abc@yyy:~/ebbe> grep VmSize /proc/15745/status /proc/15756/status /proc/15766/status
/proc/15745/status:VmSize: 688828 kB // default
/proc/15756/status:VmSize: 688892 kB // specifying initial size of 10 MB
/proc/15766/status:VmSize: 166596 kB // forcing max heap size of 10 MB
此处处理 15756 的大小表示它只是分配了默认值。
我使用以下JVM:
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxa6460sr16fp1-20140706_01(SR16 FP1))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux amd64-64 jvmxa6460sr16-20140626_204542 (JIT enabled, AOT enabled)
J9VM - 20140626_204542
JIT - r9_20130920_46510ifx7
GC - GA24_Java6_SR16_20140626_1848_B204542)
JCL - 20140704_01
我正在
上跑步SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 3
答案 0 :(得分:2)
VM确实遵循-Xms提示,但如果将其设置得太低,堆将立即增长以满足分配请求。
你总结了你的代码"不需要太多内存"基于代码中的内容。您没有考虑VM / JRE启动所消耗的内存。请注意,由于依赖性,VM在开始执行代码之前必须加载许多JRE类。
-Xms选项用于确保VM分配至少堆,其堆大小的下限。 VM总是可以自由分配更多。那是-Xmx进入图片(定义上限)。