简体   繁体   English

杀死-15后为什么java进程不退出?

[英]Why doesn't the java process exit after kill -15?

I kill the java programm by kill -15 $PID , and from the log I find the ShutdownHook is called and finished. 我通过kill -15 $PID杀死java程序,从日志中我发现ShutdownHook被调用并完成。 But the process is still running. 但这个过程仍在运行。

So I dump the threads and find most of the are daemon thread, but the following: 所以我转储线程并找到大部分是守护程序线程,但以下内容:

[xiafei.qiuxf@dwbasis130009 tesla]$ grep prio stack  | grep -v daemon
"DestroyJavaVM" prio=10 tid=0x00002aaaab072000 nid=0x79d3 waiting for monitor entry [0x0000000041da4000]
"VM Thread" prio=10 tid=0x00002aaaab112000 nid=0x79e6 runnable 
"Gang worker#0 (Parallel GC Threads)" prio=10 tid=0x00002aaaab105800 nid=0x79d4 runnable 
"Gang worker#1 (Parallel GC Threads)" prio=10 tid=0x00002aaaab106800 nid=0x79d5 runnable 
"Gang worker#2 (Parallel GC Threads)" prio=10 tid=0x00002aaaab107000 nid=0x79d6 runnable 
"Gang worker#3 (Parallel GC Threads)" prio=10 tid=0x00002aaaab107800 nid=0x79d7 runnable 
"Gang worker#4 (Parallel GC Threads)" prio=10 tid=0x00002aaaab108000 nid=0x79d8 runnable 
"Gang worker#5 (Parallel GC Threads)" prio=10 tid=0x00002aaaab109000 nid=0x79d9 runnable 
"Gang worker#6 (Parallel GC Threads)" prio=10 tid=0x00002aaaab109800 nid=0x79da runnable 
"Gang worker#7 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10a000 nid=0x79db runnable 
"Gang worker#8 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10a800 nid=0x79dc runnable 
"Gang worker#9 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10b800 nid=0x79dd runnable 
"Gang worker#10 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10c000 nid=0x79de runnable 
"Gang worker#11 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10c800 nid=0x79df runnable 
"Gang worker#12 (Parallel GC Threads)" prio=10 tid=0x00002aaaab10d000 nid=0x79e0 runnable 
"Concurrent Mark-Sweep GC Thread" prio=10 tid=0x00002aaaab111000 nid=0x79e5 runnable 
"Gang worker#0 (Parallel CMS Threads)" prio=10 tid=0x00002aaaab10e800 nid=0x79e1 runnable 
"Gang worker#1 (Parallel CMS Threads)" prio=10 tid=0x00002aaaab10f000 nid=0x79e2 runnable 
"Gang worker#2 (Parallel CMS Threads)" prio=10 tid=0x00002aaaab10f800 nid=0x79e3 runnable 
"Gang worker#3 (Parallel CMS Threads)" prio=10 tid=0x00002aaaab110800 nid=0x79e4 runnable 
"VM Periodic Task Thread" prio=10 tid=0x00002aaaab118000 nid=0x79f1 waiting on condition 

It seems that they are GC threads or jvm's threads, but none of them is mine(my threads are all finished.), so why the jvm process still keeps running? 它们似乎是GC线程或jvm的线程,但它们都不是我的(我的线程都已完成。),为什么jvm进程仍然在运行?

The dump says: 转储说:

"DestroyJavaVM" prio=10 tid=0x00002aaaab072000 nid=0x79d3 
    waiting for monitor entry [0x0000000041da4000] <<------------

That means the process to terminate the application can't proceed because someone owns the monitor 0x0000000041da4000 . 这意味着终止应用程序的过程无法继续,因为有人拥有监视器0x0000000041da4000

Look through the dump to find out which thread owns this monitor. 查看转储以找出哪个线程拥有此监视器。 That should give you an idea how to proceed. 这应该会让你知道如何继续。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM