进程内存与堆 - JVM

时间:2011-02-04 00:01:55

标签: java linux tomcat

我们在 tomcat 服务器上部署了一个Web应用程序。我们运行了某些预定的作业,之后堆内存达到峰值并稳定下来,一切似乎都很好。 然而,系统管理员抱怨内存使用情况(Linux上的“顶部”)不断增加预定作业的数量。 什么是堆内存和CPU内存之间的相互关系?可以通过任何JVM设置进行控制吗?我使用 JConsole 来监控系统 我通过JConsole强制进行垃圾收集,并且堆使用率下降,但 Linux 上的内存使用量仍然很高,而且从未降低。

任何想法或建议会有很大帮助吗?

3 个答案:

答案 0 :(得分:8)

JVM进程分配的内存与堆大小不同。使用的堆大小可能会下降而不会实际减少JVM分配的空间。 JVM必须接收一个触发器,指示它应该缩小堆大小。正如@Xepoch所提到的,这是由-XX:MaxHeapFreeRatio控制的。

  

然而,系统管理员抱怨内存使用率(Linux上的“top”)不断增加预定作业[运行]越多。

那是因为你很可能有某种内存泄漏。当系统管理员看到流程慢慢咀嚼越来越多的空间时,系统管理员会抱怨。

  

任何想法或建议会有很大帮助吗?

你看过线程数了吗?您是应用程序创建自己的线程并将它们发送到死锁并永远等待? 您是否正在使用可能正在使用JNI的任何第三方API?

答案 1 :(得分:4)

可能观察到的是虚拟大小而不是Java进程的驻留集大小?如果您的目标占用空间很小,您可能希望包含-Xms或JVM堆参数的任何最小大小,并将70%-XX:MaxHeapFreeRatio=调整为更小数字允许更积极的堆收缩。

与此同时,提供更多关于Linux记忆从未减少的评论所观察到的细节?什么指标?

答案 2 :(得分:0)

您可以使用-Xmx和-Xms设置来调整堆的大小。使用tomcat,您可以在开始之前设置环境变量:

export JAVA_OPTS=”-Xms256m -Xmx512m”

这最初会创建一个256MB的堆,最大大小为512MB。

更多细节: http://confluence.atlassian.com/display/CONF25/Fix+ +错误 '+记忆的输出+' + +通过增加+ +可用存储器