2011-02-04 86 views
8

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

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

+0

该服务器显然是一个64位服务器。 – user546352 2011-02-04 00:02:28

+0

您是否知道服务器正在运行的JVM以及强制垃圾回收后的堆内存使用情况和实际内存使用情况之间的区别? – 2011-02-04 00:06:56

+0

>>但是Linux上的内存使用率仍然很高,并且从未减少。 <<哪个是“内存使用情况”?GC通常不喜欢将内存返回给系统。 – bestsss 2011-02-04 00:43:08

回答

4

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

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

0

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

export JAVA_OPTS=”-Xms256m -Xmx512m” 

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

更多的细节: http://confluence.atlassian.com/display/CONF25/Fix+ +误差+“+内存已满] +”以+增加+提供+记忆

8

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

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

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

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

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