我在JAVA程序中遇到过OutOfMemoryError。 OutOfMemoryError发生了,但我想在它发生时记录它。 我使用-XX:OnOutOfMemoryError选项来检测它发生了,但它没有记录打印到控制台的堆栈跟踪信息。 我尝试使用重定向来记录此控制台输出,但是2>& 1,2>,并且所有其他选项都无法记录此输出,它只是打印到控制台。 有没有办法记录这个堆栈跟踪信息? 我一直在谷歌搜索和搜索stackoverflow.com但找不到答案。 请指教。
谢谢!
答案 0 :(得分:3)
选项1 :
您可以使用OnOutOfMemoryError
hook与jstack结合来获取进程的堆栈跟踪:
"-XX:OnOutOfMemoryError=jstack -l %p"
note :在生产中,你很可能会有单独的shell脚本,以避免来自不同java版本的jstack问题。
选项2 :
您可以使用setUncaughtExceptionHandler
来捕获所有异常,并专门检查OutOfMemoryError
:
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
...