Java进程卡在SIGTERM处理程序中删除文件

时间:2016-07-08 18:01:16

标签: java jvm

我有一个无法响应SIGTERM的java进程。这是一个零星的问题,但同时发生在几个服务器上。我知道我可以用SIGKILL杀死它,但是想要理解为什么它可能会被卡住而没有响应已发送给它的SIGTERM信号。查看jstack的输出,似乎以下线程被卡住了:

"SIGTERM handler" daemon prio=10 tid=0x00007fcb30006000 nid=0x259c waiting for monitor entry [0x00007fc98cd2c000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Shutdown.exit(Shutdown.java:212)
        - waiting to lock <0x00000005fc7cdc60> (a java.lang.Class for java.lang.Shutdown)
        at java.lang.Terminator$1.handle(Terminator.java:52)
        at sun.misc.Signal$1.run(Signal.java:212)
        at java.lang.Thread.run(Thread.java:745)

"SIGTERM handler" daemon prio=10 tid=0x00007fcb30005000 nid=0x30cb waiting for monitor entry [0x00007fc982282000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Shutdown.exit(Shutdown.java:212)
        - waiting to lock <0x00000005fc7cdc60> (a java.lang.Class for java.lang.Shutdown)
        at java.lang.Terminator$1.handle(Terminator.java:52)
        at sun.misc.Signal$1.run(Signal.java:212)
        at java.lang.Thread.run(Thread.java:745)

"SIGTERM handler" daemon prio=10 tid=0x00007fcb30004000 nid=0x1305 waiting for monitor entry [0x00007fc982a8a000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.Shutdown.exit(Shutdown.java:212)
        - waiting to lock <0x00000005fc7cdc60> (a java.lang.Class for java.lang.Shutdown)
        at java.lang.Terminator$1.handle(Terminator.java:52)
        at sun.misc.Signal$1.run(Signal.java:212)
        at java.lang.Thread.run(Thread.java:745)

"SIGTERM handler" daemon prio=10 tid=0x00007fcb30003000 nid=0xa3e runnable [0x00007fc982585000]
   java.lang.Thread.State: RUNNABLE
        at java.io.UnixFileSystem.delete0(Native Method)
        at java.io.UnixFileSystem.delete(UnixFileSystem.java:265)
        at java.io.File.delete(File.java:1035)
        at java.io.DeleteOnExitHook.runHooks(DeleteOnExitHook.java:80)
        at java.io.DeleteOnExitHook$1.run(DeleteOnExitHook.java:49)
        at java.lang.Shutdown.runHooks(Shutdown.java:123)
        at java.lang.Shutdown.sequence(Shutdown.java:167)
        at java.lang.Shutdown.exit(Shutdown.java:212)
        - locked <0x00000005fc7cdc60> (a java.lang.Class for java.lang.Shutdown)
        at java.lang.Terminator$1.handle(Terminator.java:52)
        at sun.misc.Signal$1.run(Signal.java:212)
        at java.lang.Thread.run(Thread.java:745)

还有许多其他线程,但其中没有任何一个看起来与众不同。持有锁的线程似乎正在删除某个文件。有谁知道这个文件可能是什么以及为什么删除它可能会被卡住?

1 个答案:

答案 0 :(得分:2)

正在删除使用File.deleteOnExit在JVM终止上标记为删除的文件。这可能是您的代码或您的库创建的临时文件。我不清楚为什么这可能会悬而未决。也许文件是在一个非常慢的文件系统(远程文件系统)上,或者某些I / O设备已经死了?

如果您在代码中找到deleteOnExit的来电者时未找到可能的候选人,那么找出这个文件可能会很复杂。

您可以在JVM的打开文件列表中检查可能的候选人(lsof),但该文件当前可能无法打开。

最好的办法是在发送SIGTERM之前将stracestrace -e unlink,unlinkat -p <PID>连接到JVM,并检查JVM尝试删除哪些文件。

相关问题