当前位置: 首页 > 知识库问答 >
问题:

关于 JVM 堆参数 -Xmx 和 -Xms

阎裕
2023-03-14

我有以下代码:

public static void main(String[] args) {
    for(int i=0;i<10;i++) {
        System.out.println(i);
        byte[] b = new byte[1024*1024*5];
    }
}

您可以看到每个操作分配5M。当我设置-Xms8M-Xmx8M时,它无一例外地成功运行,而当-Xms7M-Xmx7M时,它会引发OutOfMemoryError异常。有人能解释一下为什么吗?我在Windows 7、64bit、Eclipse 4.3下。以下代码是相同的结果:

public static void main(String[] args) {
    byte[] b;
    for(int i=0;i<10;i++) {
        System.out.println(i);
        b = new byte[1024*1024*5];
    }
}

共有2个答案

凤安然
2023-03-14

因为执行程序涉及创建类加载器,加载类,实例化系统输出流等。这些操作还需要在堆上分配内存。

邹锦
2023-03-14

你错误地认为该程序只分配了5MB的内存,你错了。仅仅因为你创建了一个5MB的数组并不意味着没有额外的内存用于类加载和其他事情。

因此,为了回答您的问题,您为进程分配的内存太少。

 类似资料:
  • 我有这些jvm参数集

  • 问题内容: 在阅读有关该主题的已问问题和大量谷歌搜索之后,我仍然无法清楚了解 -Xms 选项 我的问题是:和之间有什么区别? 现在,我有以下答案: 唯一的区别是在应用程序运行期间将运行的垃圾回收数量和内存分配数量。我对吗 ? 这是我获得此答案的原因: 将选项设置为不会导致我的应用程序在启动后真正占用物理内存。我想这与现代OS虚拟内存管理和惰性页面分配有关。(我注意到,在Linux上由top或Win

  • 问题内容: 请说明JVM 中Xms和Xmx参数的使用。它们的默认值是多少? 问题答案: 该标志指定Java虚拟机(JVM)的最大内存分配池,而Xms指定初始内存分配池。 这意味着你的JVM将以一定数量的内存启动,并且将能够使用最大数量的内存。例如,启动如下所示的JVM将以256 MB的内存启动它,并将允许该进程使用最多2048 MB的内存: 也可以以不同的大小(例如千字节,兆字节等)指定内存标志。

  • 我在WebSphere管理控制台中:Application servers>as-name>Process definition>Java Virtual Machine。 有一个字段“最大堆大小”。 指定最大堆的两个选项有什么区别?

  • 据我所知,两者都定义大小。没有?建议使用什么:或?如果我两个都用,哪一个比另一个好?

  • 问题内容: 我试图找出是否有一种方法可以从正在运行的Java进程中确定JVM启动属性。具体来说,我试图找出存储- Xmx(最大堆大小)和-XX:MaxPermSize之类的参数的位置。我正在运行Sun的1.6 jvm。 如果您想知道为什么要执行此操作,则有许多JVM Web服务器可能已正确配置,也可能未正确配置,因此我想将其添加到启动代码检查中。对于我来说,签入到处部署的一段Java代码比手动查找