java - JVM 忽略 Xms 设置

标签 java linux jvm

我有以下 Java 程序,我认为它不需要太多 Java 堆:

sleep 测试.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

最佳答案

VM 确实遵守 -Xms 提示,但如果您将其设置得太低,堆将立即增长以满足分配请求。

您根据代码中的内容得出代码“不需要太多内存”的结论。您没有考虑启动 VM/JRE 所消耗的内存。请注意,由于依赖关系,VM 在开始执行您的代码之前必须加载大量 JRE 类。

-Xms 选项旨在确保 VM 分配至少 尽可能多的堆,它是堆大小的下限。 VM 总是可以自由分配更多。这就是 -Xmx 发挥作用的地方(定义上限)。

关于java - JVM 忽略 Xms 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760278/

相关文章:

Java:JVM 将如何优化对 void 和空函数的调用?

java - 为什么无法从 DolphinDB GUI 中看到我通过 JAVA API 创建的内存表?

java - 如何在 Java 代码中调用 bash cmd "find -L"

java - 通过 apache HttpClient 3.1 在大型 HTTP MultipartRequestEntity 上发生 OutOfMemory

Linux:如何从文件名中提取信息?

linux - 如何使用TC过滤 'so_mark'标记的数据包

.net - 压缩对象指针的目的是什么?

java - 计算为 Java 代码执行的字节码的最佳方法

java - 如何检测我的程序是否在Windows 7下 "windows xp mode"下运行

java - 我的问题是关于android Activity Intent