OutOfMemoryError
is just like any other error. If it escapes from Thread.run()
it will cause thread to die. Nothing more. Also, when a thread dies, it is no longer a GC root, thus all references kept only by this thread are eligible for garbage collection. This means JVM is very likely to recover from OOME.
If you want to kill your JVM no matter what because you suspect it can be in an inconsistent state, add this to your java
options:
-XX:OnOutOfMemoryError="kill -9 %p"
%p
is the current Java process PID placeholder. The rest is self-explained.
Of course you can also try catching OutOfMemoryError
and handling it somehow. But that's tricky.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…