【发布时间】:2012-11-22 20:23:54
【问题描述】:
我在 4-cpu 和 32GB 内存的 64 位机器上运行 Tomcat(操作系统是 CentOS 6.3)。我启动 Tomcat 的 Java 选项是 -server -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
一开始,使用top的RES只有810MB,而且还在不断增加。在此期间,我运行jmap -J-d64 -histo pID 检查 Java 内存堆,我认为 gc 工作正常,因为堆峰值为 510MB,gc 后约为 200MB。但是当top hit 1.1g时,CPU使用率会超过100%,Tomcat会挂掉。
当 CPU 使用率为 100% 时,使用jstack pid 查看转储,名为“vm thread”的线程几乎消耗了 100% 的 CPU。我用谷歌搜索,它是 JVM gc 线程。所以我的问题是:为什么当 gc 工作正常时 res 会继续增长?我该如何解决这个问题?谢谢。
【问题讨论】:
-
我看到你已经接受了我的回答。出于好奇,能否请您简要描述一下原因以及具体有什么帮助?
-
当 gc 线程占用超过 100% cpu 时,我首先想到的是内存泄漏。但事实是 -Xmx1024m 对我的应用程序来说太小了.....我犯了一个错误:(我把内存增加到2048m(-Xmx2048m),top的RES到了1.2g就没有增加......
-
那我猜@digitaljoel 的回答更适合接受
-
好的。听从了你的建议:)
标签: java memory-leaks cpu-usage