【问题标题】:java max heap size and OS top outputjava最大堆大小和操作系统顶部输出
【发布时间】:2012-02-06 23:25:34
【问题描述】:

我正在尝试运行一个 jar 文件,但我想处理 jvm 最大堆大小。我使用 -Xmx80m 参数来设置最大磁头大小 80MB。

我使用我的 linux 操作系统的“top”命令来监控我的应用程序的内存分配,我很惊讶 jvm 使用的内存比我使用 -Xmx 参数 (java -Xmx80m -jar myapp.jar) 指定的更多。更具体地说,来自我的顶级输出

VIRT:257m
分辨率:109m

我认为 RES 应该是最大 80mb,如果我的应用程序需要超过 80mb,jvm 会抛出异常“内存不足”(或类似的东西)

在我的应用程序中,我使用的是外部库。除了我用参数指定的堆之外,这个库是否使用自己的内存?

无论如何,我如何限制 jvm 的内存使用,以免克服我用参数设置的问题?

更新:
使用ulimit(unix命令)来限制JVM使用的资源是不是很好的解决方案?

我正在使用:

java版本“1.7.0_02”
Java(TM) SE 运行时环境(内部版本 1.7.0_02-b13)
Java HotSpot(TM) 服务器虚拟机(build 22.0-b10,混合模式)

在 Fedora 8 电脑上

【问题讨论】:

  • "堆大小" != "JVM 使用的内存"。顺便说一下,在这些情况下,您使用的是什么 JVM/版本以及在哪个平台上很重要。

标签: java jvm heap-memory


【解决方案1】:

您不应期望 -Xmx 会对 JVM 使用的总内存施加硬性限制。

-Xmx 对 Java 堆的大小进行了限制。 Java 堆之外的任何内存都不受此限制。这包括代码、类元数据、常量池等。

您可以调整的另一件事是永久空间 (-XX:MaxPermSize) 的大小,因为它不包含在 -Xmx 中。

【讨论】:

    【解决方案2】:

    -mx-Xmx 选项设置最大堆大小。此虚拟内存在启动时分配并在程序运行时使用。正如@aix 所说,非堆内存可以更多。

    外部本机库将使用其自己的非堆内存。最大值将限制所有库的堆。 (预先分配,不能增加)

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2013-12-05
      • 2015-07-17
      • 2020-01-16
      • 2011-05-19
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多