我有一个在jboss-5.0.0.GA上运行的Java EE应用程序。该应用程序使用BIRT报告工具生成多个报告。
服务器有4个2.4 Ghz核心和8 Gb ram。
启动脚本正在使用下一个选项:
-Xms2g -Xmx2g -XX:MaxPermSize=512m
使用这种配置,应用程序已经达到了一定的稳定性,前段时间我因为内存已满而崩溃了很多。
现在Rigth,应用程序没有崩溃,但内存总是被完全使用。 top命令的示例:
Mem: 7927100k total, 7874824k used, 52276k free
java进程显示使用2.6g,这是该服务器上运行的唯一应用程序。
我可以做些什么来确保一定的可用内存量?
如何尝试查找内存泄漏?
还有其他建议吗?
TIA
根据mezzie的回答:
如果您使用的是linux,那该怎么办? 内核确实与内存有关 与Windows如何工作不同。在 linux,它会尽力用掉所有的 记忆。它使用了一切后,它 然后将回收内存 进一步使用。这不是记忆 泄漏。我们也有jboss tomcat linux服务器和我们做过研究 这个问题不久前。
我找到了更多相关信息,
http://lwn.net/Articles/329458/
好吧,半个内存被缓存:
total used free shared buffers cached
Mem: 7741 7690 50 0 143 4469
答案 0 :(得分:1)
我敢打赌那些是操作系统mem值,而不是Java mem值。 Java使用所有内存到-Xmx,然后开始垃圾收集,大大过度简化。使用jconsole查看真正的Java内存使用情况。
答案 1 :(得分:1)
如果您使用的是Linux,那么内核对内存的作用与Windows的工作方式不同。在linux中,它会尝试耗尽所有内存。在使用完所有内容后,它将回收内存以供进一步使用。这不是内存泄漏。我们的Linux服务器上也有jboss tomcat,我们前一段时间研究过这个问题。
答案 2 :(得分:1)
为简单起见,JVM的最大内存量等于MaxPermGen(永久用作JVM正在运行。它包含类定义,因此它不应随服务器的负载而增长)+ Xmx(最大值)对象堆的大小,其中包含当前在JVM中运行的对象的所有实例)+ Xss(线程堆栈空间,具体取决于在JVM中运行的线程数,大多数情况下,服务器可以限制它)+直接内存空间(由-XX:MaxDirectMemorySize = xxxx设置)
所以做数学。如果你想确定剩下空闲内存,你必须限制MaxPermGen,Xmx和服务器上允许的线程数。
风险是,如果服务器上的负载增长,您可以获得OutOfMemoryError ......