java - JVM 超出了用 -Xmx 定义的最大内存

标签 java memory-management memory-leaks

我们有一个从 Java 1.5.0.19 升级到 Java 1.6.0.21 的 Java webapp

/usr/java/jdk1.6.0_21/bin/java -server -Xms2000m -Xmx3000m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dwg.environment=production -Djava.io.tmpdir=/var/cache/jetty -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=31377 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/webapp -Dprogram.name=run.sh -Djava.endorsed.dirs=/opt/3p/jboss/lib/endorsed -classpath /opt/3p/jboss/bin/run.jar:/usr/java/jdk1.6.0_21/lib/tools.jar org.jboss.Main -c default

如您所见,它应该预分配 2GB 的堆,最大为 3GB(我们预分配这么多的原因是因为这个应用程序很古老且设计不佳,所以有很多东西要加载)。我们最近在升级到 1.6 后看到的问题是内存有时会爆棚。虽然内存使用可能是应用程序问题,但 JVM 超过了堆的 3GB 最大设置。使用 top 我看到了:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    
8449 apache    18   0 19.6g 6.9g 5648 S  4.0 84.8  80:42.27 java             

那么具有 3GB 堆、256MB permgen 甚至一些开销的 JVM 怎么会消耗 6.9GB? JVM 中的错误将通过升级到构建 #35 来修复? Java 中缺少什么可以使用额外的内存?只是想看看以前是否有人见过这个。

最佳答案

So how could a JVM with 3GB heap, 256MB permgen, and even some overhead consume 6.9GB?

可能的解释包括:

  • 很多很多线程堆栈,
  • 未在应关闭时关闭的内存映射文件,
  • 一些 native 代码库使用(可能泄漏)堆外内存。

在责怪 JVM 之前,我倾向于责怪应用程序。

关于java - JVM 超出了用 -Xmx 定义的最大内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292368/

相关文章:

c - 一个跟踪 CPU 时间和内存使用情况的 Linux shell

hibernate - 在 Grails/Tomcat 上的长批处理期间出现 OutOfMemoryError

c++ - Assimp 泄漏内存

java - 如何在 Android 中全局声明一个资源

java - Jackson 用空对象反序列化数组

java - 使用 KeyListener 使用箭头键在 JPanel 中移动矩形

javascript - 我们如何测试 `div.innerHTML=""` 是否会占用内存,直到页面刷新或浏览器关闭?

c - 当我声明一个字符串时保留多少内存?

c - 释放数据时内存泄漏?

java - 有没有办法用 "or"语句绕过正则表达式分组?