2016-07-08 9 views
1

SIGTERMに応答しないJavaプロセスがあります。これは散発的な問題ですが、複数のサーバーで同時に発生しました。私はSIGKILLでそれを殺すことができますが、SIGTERMに送信されたSIGTERMシグナルに応答しない理由を理解したいと思っています。他の多くのスレッドがありますJavaプロセスがSIGTERMハンドラでスタックしてファイルを削除しています

"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) 

が、何もそこに普通の外に見えない:jstackの出力を見ると、次のスレッドが立ち往生しているようです。ロックを保持するスレッドは、一部のファイルを削除しているようです。誰もがこのファイルが何であり、なぜそれが削除されているのか知っていますか?

答えて

2

JVM終了時に削除対象としてマークされたファイルをFile.deleteOnExitで削除しています。おそらくあなたのコードやあなたのライブラリを作成した一時ファイルです。なぜこれがぶら下がっているのかはわかりません。ファイルが非常に遅いファイルシステム(リモートファイルシステム)にあるか、または一部のI/Oデバイスが停止している可能性がありますか?

コード内でdeleteOnExitへの発信者を探すときに候補者が見つからない場合は、どのファイルを見つけるのが複雑になる可能性があります。

JVMの開いているファイルのリスト(lsof)で候補者を確認できますが、ファイルが現在開かれていない可能性があります。

おそらく最も適切なのはstrace -e unlink,unlinkat -p <PID>straceをあなたのJVMに添付してSIGTERMを送信し、JVMが削除を試みるファイルをチェックすることです。

関連する問題