问题场景:发现sonic MF容器( jvm).The容器托管了一些负责db操作的java服务,启动了消息transformations.Once,容器正常运行2-3周后自行销毁,没有抛出异常。
经过大量研究,我们无法找出为什么或者是什么触发了jvm (MF Container)关闭。
有没有一种方法可以在jvm自动关闭时获得线程转储?我使用的是java 1.6。对于这个问题,有没有其他我应该遵循的方法?
提前谢谢。
发布于 2012-05-23 15:17:14
您可以尝试使用java.lang.Runtime.addShutdownHook(),让钩子遍历所有线程,并使用Thread.getAllStackTraces()转储它们的堆栈跟踪。但是,如果JVM被Runtime.halt()关闭,那么钩子就不会被调用。更复杂的方法是使用instrumentation连接到对Runtime.exit()和Runtime.halt() (或Shutdown.sequence(),请参见编辑#2)的调用,这样您就可以确切地看到在调用这两个调用时发生了什么。
编辑:另一种方法是安装一个SecurityManager,它不强制执行任何安全性,但每当SecurityManager.checkExit()被调用时,它都会转储线程列表,因为halt()和exit()都调用该安全性管理器方法。这将比使用插装容易得多,您甚至可以决定在记录线程正在做什么的同时抛出一个异常。
JVM edit2jvm:运行的系统会通知终止,在这种情况下,使用安全管理器将不起作用。在Runtime.exit()或Runtime.halt()上使用插装也不会,因为被调用的方法是java.lang.Shutdown.exit()。如果JVM因为最后一个守护进程线程完成而关闭,那么就会调用Shutdown.shutdown()。但是在这两种情况下,shutdown hooks 都能正常工作。因此,您应该始终使用关闭钩子,即使您还将使用安全管理器或工具。
发布于 2018-02-24 15:03:01
另请参见https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html“疑难解答挂起或循环进程”
但是,至少在我的例子中,Eclipse挂起了,并且不响应任何这些请求。
https://stackoverflow.com/questions/10714828
复制相似问题