加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JVM超过用-Xmx定义的最大内存

发布时间:2020-12-14 14:26:48 所属栏目:Java 来源:网络整理
导读:我们有一个 Java webapp,我们从 Java 1.5.0.19升级到Java 1.6.0.21 /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
我们有一个 Java webapp,我们从 Java 1.5.0.19升级到Java 1.6.0.21
/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

那么JVM怎么能有3GB堆,256MB的permgen,甚至一些开销消耗6.9GB?通过升级到#35将修复的JVM中的Bug?在java中可能会使用额外的内存的东西丢失了吗?只是想看看有没有人看过这个.

解决方法

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

可能的解释包括:

>大量的线程堆栈,
>内存映射文件,当它们应该是不被关闭时,
>一些本机代码库使用(可能泄漏)的堆内存.

在指责JVM之前,我会倾向于责怪应用程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读