在生产中,我们有一个CentOS 5 linux盒,它在1.6.0_21上运行多个ApacheTomcat5.5.30实例。每个Tomcat都托管一个Java,它从Postgres9.1RDBMS中提取数据,并生成HTML/PDF/etc报告。
每隔几天,由于触发器尚未确定,其中一个Java进程将开始增加它的RAM使用量(数十次),直到机器开始将内存分页到HD,使整个服务器陷入停滞状态。我通常会使用JProbe来监视哪些对象正在消耗所有的内存,但是由于服务器是一个无头的linux安装,所以这不是一种选择。
是否有一个无头工具(CLI)可以定期记录哪些Java对象消耗的内存最多?这是诊断这个问题的最好方法吗?
更新:使用下面收到的反馈,我意识到问题的一部分是我们没有真正的崩溃,但是进程只是将RAM页放到HD上,直到整个机器变得没有响应。解决这个问题的一个解决方案(我认为)是设置-Xmx参数,以限制Java可以使用的最大内存数为几个GB。不幸的是,JVM似乎忽略了这个设置,并且在不崩溃的情况下消耗了它想要的东西。还有别的办法来强制限制吗?
发布于 2012-03-15 04:11:00
我在这里看到两个问题:
发布于 2012-03-15 03:45:55
有几种方法可以解决这个问题。
显然,第一步是启用垃圾收集日志记录(添加类似于-verbose:gc -Xloggc:/path/ to /gc.log、-XX:+PrintGCDetails等)
接下来是JDK工具(jvisualvm和visuagc插件)和jmap (jmap -histo使您可以运行在活动对象上)。是的,jvisualvm是一个GUI工具,但我认为您可以进行X扩展。
你不介意自己摆弄一下吧?为什么不为您的关键类和方法编写BTrace探测呢?
还是没有足够的信息?可能想试试像AppDynamicsLite这样的工具(也可以免费从广告中剥离出来)。http://www.appdynamics.com/products-free-download.php )
这就是我为这份工作会带来的工具包。
https://stackoverflow.com/questions/9713642
复制相似问题