2012-03-15 111 views
1

在生产中,我们有一个CentOS 5 Linux机箱,它运行Apache 1.6.0_21上的多个Apache Tomcat 5.5.30实例。每个Tomcat都托管一个Java EE WebApp,它从Postgres 9.1 RDBMS中提取数据并生成HTML/PDF /等报告。

每隔几天,由于触发器尚未确定,其中一个Java进程将开始增加内存使用量(几十个演出),直到机器开始将内存分页为HD,从而使整个服务器到达一个静止的。 我通常会使用JProbe来监视对象正在消耗的所有内存,但由于服务器是无头Linux安装,这不是一个选项。

是否有一个无头(CLI)工具可以定期记录哪些Java对象消耗的内存最多?这甚至是诊断问题的最好方法吗?如何诊断与生产linux内存相关的Java崩溃问题

UPDATE: 使用以下收到的反馈,我意识到问题的一部分是,我们没有得到实际的碰撞,但流程刚刚页面RAM到HD直到整个机器变得反应迟钝。这个(我想)的一个解决方案是设置-Xmx参数,以限制Java可以使用的最大内存容量为几GB。不幸的是,JVM看起来好像忽略了这个设置,并且尽可能多的消费而不会崩溃。是否有另一种强制执行限制的方法?

+0

你可以告诉JVM和操作系统版本。 – 2012-03-16 03:29:51

+0

另外,请做一个ps -el | grep java并发送传递给进程的最终参数。 – 2012-03-16 04:20:38

回答

0

有几种方法可以解决这个问题。

显然的第一步是使垃圾收集日志记录(添加像-verbose PARAMS:GC -Xloggc:/path/to/gc.log -XX:+ PrintGCDetails等)

接着在线路是JDK工具(带有visuagc插件的jvisualvm)和jmap(jmap -histo可以让你在活动对象上运行)。是的,jvisualvm是一个GUI工具,但是我认为你可以做X前进。

不介意自己拨弄一下吗?为什么不为你的关键类和方法编写BTrace探针?

仍然没有足够的信息?可能想尝试像AppDynamicsLite这样的工具(免费从一个商业分拆.. http://www.appdynamics.com/products-free-download.php

这是我为工作带来的一种工具包。

+0

您可以使用[GCViewer](http://www.tagtraum.com/gcviewer.html)帮助分析GC日志。该网站还有关于如何解决内存问题的其他技巧。 – radimpe 2012-03-15 17:56:17

1

在这里我看到两个问题:

  1. 你的VM不会页面,除非可用的RAM <最大堆定义。因此,请确定最大堆定义少于可用RAM(总RAM - 所有其他进程使用的RAM)
  2. 接下来,假设您看到OutOfMemoryErrors,plesae通过添加JVM参数-XX:+在OOME上启用堆转储HeapDumpOnOutOfMemoryError
  3. 当您下次遇到问题时,您将获得堆转储,可以使用Eclpise MAT或Yourkit分析器分析堆转储,以查看填满内存的内容。这将告诉你代码的哪一部分实际上导致了问题。