如何检测内存不足情况?

Jar*_*ala 8 java websphere memory-leaks out-of-memory

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

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

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

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

Mar*_*ark 10

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

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<value>
Run Code Online (Sandbox Code Playgroud)

  • 只需使用类似这样的信息通知您:-XX:OnOutOfMemoryError ="echo PID%p刚刚生成了一个堆转储| mail admin@admin.com"给您邮寄或运行您要通知您的任何命令. (2认同)

gus*_*afc 5

如果你想让堆转储自动化,我会看到两个选项,但在OOM上使用堆转储的@ Mark解决方案并不令人满意.

  1. 您可以使用它MemoryMXBean来检测高内存压力,然后在使用量(或使用量增量)看起来很高时以编程方式创建堆转储.
    • 您可以定期获取内存使用信息并使用cron'd shell脚本生成堆转储jmap(在本地和远程工作).

如果你可以在OOM上进行回调会很好,但是,嗯,回调可能只会因OOM错误而崩溃.:)