我有一个 Java 批处理,它永远不会完成。它在代码末尾调用 System.exit() ,但根据线程转储,由于某种原因它被阻塞在 Shutdown.halt0() 处,并且批处理永远不会完成。造成这种情况的原因是什么?
它使用 mysql-connector-java 5.1.38,我还看到一个线程被阻塞在 AbandonedConnectionCleanupThread.run()
但我不确定它是否与这个问题有关.
Java版本:
$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
线程转储:
Attaching to process ID 7229, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
Deadlock Detection:
No deadlocks found.
Thread 7244: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Compiled frame)
- com.mysql.jdbc.AbandonedConnectionCleanupThread.run() @bci=16, line=43 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 7238: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 7237: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 7236: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
- java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 7230: (state = BLOCKED)
- java.lang.Shutdown.halt0(int) @bci=0 (Interpreted frame)
- java.lang.Shutdown.halt(int) @bci=7, line=139 (Interpreted frame)
- java.lang.Shutdown.exit(int) @bci=99, line=213 (Interpreted frame)
- java.lang.Runtime.exit(int) @bci=14, line=109 (Interpreted frame)
- java.lang.System.exit(int) @bci=4, line=971 (Interpreted frame)
- com.example.xxx.main(java.lang.String[]) @bci=140, line=71 (Interpreted frame)
Locked ownable synchronizers:
- None
最佳答案
添加选项DONT_FAKE_MONOTONIC=1
解决了问题。
我的应用程序中使用了一个名为“libfaketime”的 native 库,该选项似乎是一种解决方法。详情:https://github.com/wolfcw/libfaketime/issues/109
关于Java 批处理由于在 java.lang.System.exit(int) 处被阻止而永远无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293922/