首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JVM自动终止时生成线程转储

如何在JVM自动终止时生成线程转储
EN

Stack Overflow用户
提问于 2012-05-23 14:49:26
回答 2查看 5.1K关注 0票数 3

问题场景:发现sonic MF容器( jvm).The容器托管了一些负责db操作的java服务,启动了消息transformations.Once,容器正常运行2-3周后自行销毁,没有抛出异常。

经过大量研究,我们无法找出为什么或者是什么触发了jvm (MF Container)关闭。

有没有一种方法可以在jvm自动关闭时获得线程转储?我使用的是java 1.6。对于这个问题,有没有其他我应该遵循的方法?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 都能正常工作。因此,您应该始终使用关闭钩子,即使您还将使用安全管理器或工具。

票数 5
EN

Stack Overflow用户

发布于 2018-02-24 15:03:01

另请参见https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html“疑难解答挂起或循环进程”

但是,至少在我的例子中,Eclipse挂起了,并且不响应任何这些请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10714828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档