进程内存vs堆 – JVM

我们有一个在tomcat服务器上部署的web应用程序。 我们运行了一些预定的工作,然后堆内存达到最高点并稳定下来,一切似乎都很好。 然而,系统pipe理员抱怨说,内存使用(Linux上的“最高”)持续增加,计划的工作越多。 堆内存和CPU的内存之间的关系是什么? 它可以通过任何JVM设置来控制吗? 我使用JConsole监视系统。
我强制通过JConsole进行垃圾回收,并且堆使用率降低了,但是Linux上的内存使用率仍然很高,并且从未减less。

任何想法或build议将有很大的帮助?

Solutions Collecting From Web of "进程内存vs堆 – JVM"

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

同时,提供关于Linux内存从未减少的评论的更多细节? 什么指标?

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

然而,系统管理员抱怨说,内存使用(Linux上的“最高”)持续增加,计划的作业越多[运行]。

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

任何想法或建议将有很大的帮助?

你看过线程的数量吗? 你是应用程序创建自己的线程,并发送到僵局,永远等待空闲? 你是否与任何可能使用JNI的第三方API集成?

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

 export JAVA_OPTS=”-Xms256m -Xmx512m” 

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

一些更多的细节: http : //confluence.atlassian.com/display/CONF25/Fix+出+ +内存+错误+ +增加+可用+内存