我们今天有一个生产的java进程冻结了。我们做了一些系统检查,比如磁盘空间检查,内存争用等等。我们猜测进程已经死锁,所以在我们退出进程之前,我们在pid上运行了pstack
命令。我无法从输出中解释得太多。我如何阅读这些日志?我谷歌搜索了pstack和相关的帮助,但没有得到太多信息..
这是堆栈跟踪的顶部。看起来我们在等待条件?从JNI线程调用DestroyVM
是危险的吗?
Thread 87 (Thread 0x406a3940 (LWP 18762)):
#0 0x000000325d60a899 in pthread_cond_wait@@GLIBC_2.3.2 ()
#1 0x00002b6f8fd9177e in os::PlatformEvent::park ()
#2 0x00002b6f8fd67595 in Monitor::IWait ()
#3 0x00002b6f8fd67bfd in Monitor::wait ()
#4 0x00002b6f8fea0295 in Threads::destroy_vm ()
#5 0x00002b6f8fba6eab in jni_DestroyJavaVM ()
#6 0x000000004000223f in JavaMain ()
#7 0x000000325d606367 in start_thread () from /lib64/libpthread.so.0
#8 0x000000325cad30ad in clone () from /lib64/libc.so.6
非常感谢任何指针/帮助。谢谢!
答案 0 :(得分:1)
您在此处看到的堆栈来自jvm
本身,而不是您的java进程。
不要忘记Java的JVM是一种虚拟化器,程序的字节码指令由JVM解释和执行,JVM只不过是一个C(C ++肯定)程序。
所以我猜你可以从这个堆栈中提取的信息不多,你应该将java调试器(jdb
?)连接到你的JVM(如果允许的话),以获得有意义的回溯。