如何提高Jboss使用的内存量?

时间:2010-11-17 23:40:47

标签: java linux jboss redhat

我有一个在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服务器和我们做过研究   这个问题不久前。

我找到了更多相关信息,

https://serverfault.com/questions/9442/why-does-red-hat-linux-report-less-free-memory-on-the-system-than-is-actually-ava

http://lwn.net/Articles/329458/

好吧,半个内存被缓存:

             total       used       free     shared    buffers     cached
Mem:          7741       7690         50          0        143       4469

3 个答案:

答案 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 ......