如何检测内存不足情况?

时间:2009-08-25 08:42:31

标签: java memory-leaks websphere out-of-memory

我有一个在Websphere Application Server 6.0上运行的应用程序,由于内存不足,它几乎每天都会崩溃。从详细的GC确定存在内存泄漏(其中许多)

不幸的是,应用程序是由外部供应商提供的,并且解决问题的方法很慢。痛苦的过程。作为流程的一部分,我需要在每次OOM发生时收集日志和堆转储。

现在我正在寻找一些如何实现自动化的方法。基本问题是如何检测OOM条件。一种方法是创建shell脚本,它将定期搜索新的heapdumps。这种做法看起来有点脏。另一种方法可能是以某种方式利用JMX。但是我在这方面很少或根本没有经验,也不知道该怎么做。

或者是WAS的某种触发/挂钩?非常感谢你的每一个建议!

9 个答案:

答案 0 :(得分:10)

您可以在启动时将以下参数传递给JVM,并在OutOfMemoryError上自动生成堆转储。第二个参数允许您指定堆转储文件的路径。至少使用它可以检查是否存在特定文件以查看是否发生了堆转储。

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<value>

答案 1 :(得分:5)

如果您希望自动进行堆转储,我会看到两个选项,但在OOM上使用堆转储的@Mark's solution并不令人满意。

  1. 您可以使用MemoryMXBean检测高内存压力,然后使用programmatically create a heap dump(如果使用量(或使用量增量)似乎很高)。
    • 您可以使用jmap定期获取内存使用信息并使用cron'd shell脚本生成堆转储(在本地和远程工作)。
  2. 如果你可以在OOM上进行回调会很好,但是,嗯,回调可能只会因OOM错误而崩溃。 :)

答案 2 :(得分:4)

你看过JConsole了吗?它使用JMX为您提供各种JVM指标的可见性,包括内存信息。使用它开始时可能值得监视您的应用程序,以了解内存消耗的方式/时间。您可能会发现内存在一天中或使用某些功能时均匀消耗。

请查看以上链接的detecting low memory部分。

如果您需要,可以编写JMX client来自动观看应用程序 并触发所需的任何操作。 JConsole将指出您需要轮询哪些JMX方法。

答案 3 :(得分:2)

等待应用程序崩溃的替代方法可能是如果你乐观地认为它可以存活12个小时,就像每个晚上一样控制重启脚本。

甚至websphere也可以为你做到这一点!?

答案 4 :(得分:1)

您可以添加一个侦听器(会话范围或应用程序范围属性侦听器)类,每次在会话/应用程序范围中添加新对象时都会调用该类。

在此 - 您可以尝试检查应用程序使用的总内存(记录它),如调用运行gc(请注意,调用它不会暗示gc将始终运行)

(以上是基于使用量增长的记录部分和gc)

对于预定的gc: 此外,您可以保留每隔几小时运行一次的计时器任务类,并请求gc。

答案 5 :(得分:1)

从监控角度来看,我们在ITCAM方面的经验并不那么出色。我们将它倾向于CA Wily Introscope。

答案 6 :(得分:0)

你有没有看过最新的Java 6 JDK中的visualvm工具?

非常适合检查正在运行的代码。

答案 7 :(得分:0)

我发现当你发生OOM时你需要堆转储。随着时间的推移定期收集信息应该可以了解正在发生的事情。

如已经观察到的,存在用于分析这些问题的各种工具。我在ITCAM for WebSphere方面取得了成功,作为一名IBM客户,我可以随时访问它。我们很快能够在问题情况下识别出确切的代码行。

如果有任何方法你可以获得这种性质的工具那么这就是你要走的路。

答案 8 :(得分:0)

应该可以编写一个简单的程序来从内核获取进程列表并扫描它以查看您的WAS进程是否仍在运行。在Unix机器上你可能会在几分钟内在Perl中掀起一些东西(如果你知道Perl),不确定它在Windows下有多难。每五分钟左右运行一次作为计划任务,如果进程没有显示,你可以让它解决另一个处理堆转储并重新启动WAS的进程。