我想为我的系统提供一种检测是否发生内存不足异常的方法。此练习的目的是通过 JMX 公开此标志并采取相应措施(例如,通过在监控系统上配置相关警报),否则这些错误会在几天内被忽视。
天真的方法是为每个线程设置一个未捕获的异常处理程序,并检查引发的异常是否是实例OutOfMemoryError
并设置相关标志。但是,由于以下原因,这种方法并不现实:
- 异常可能发生在任何地方,包括 3rd 方库。我无法阻止他们抓住
Throwable
并为自己保留它。 - 库可以产生自己的线程,我无法为这些线程强制执行未捕获的异常处理程序。
我看到的一种可能的情况是字节码操作(例如在 顶部附加某种方面OutOfMemoryError
),但是我不确定这是否是正确的方法,或者这在一般情况下是否可行。
我们已-XX:+HeapDumpOnOutOfMemoryError
启用,但我不认为这是解决此问题的方法,因为它是为其他目的而设计的 - 并且在发生这种情况时它不提供 Java 回调。
有人做过吗?你会如何解决它或建议解决它?欢迎任何想法。