当前位置: 首页 > 面试题库 >

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

华誉
2023-03-14
问题内容

问题场景:在sonic
MF容器(jvm)中发现了问题。该容器托管了一些负责db操作和消息转换的Java服务。启动后,该容器可以正常运行2-3周,并自行终止而不抛出任何例外。

经过大量研究,我们无法找出导致jvm(MF容器)关闭的原因或原因。

有没有一种方法可以在jvm自动关闭时获取线程转储?我正在使用Java 1.6。我应该采取其他方法解决此问题吗?

提前致谢。


问题答案:

您可以尝试java.lang.Runtime.addShutdownHook(),并使该钩子遍历所有线程,并使用Thread.getAllStackTraces()转储其堆栈跟踪。但是,如果JVM已关闭,Runtime.halt()则不会调用该挂钩。更为复杂的是使用工具挂接到对Runtime.exit()和的调用Runtime.halt()(或Shutdown.sequence(),请参阅编辑#2),这样您就可以准确地看到在调用两者时发生的情况。

编辑
:做这将是安装的另一种方式安全管理器,只要它不执行任何安全性,但它转储线程列表SecurityManager.checkExit()被调用,因为两者halt()exit()调用安全管理方法。这将比使用检测工具容易得多,并且您甚至可以决定在记录线程正在执行的操作之外引发异常。

编辑2 :运行JVM的系统可以告诉JVM终止,在这种情况下,使用安全管理器将无法工作。也不会在Runtime.exit()or
上使用检测Runtime.halt(),因为调用的方法是java.lang.Shutdown.exit()。如果由于最后一个守护程序线程完成而关闭了JVM,则将Shutdown.shutdown()调用它。但是关闭挂钩
在两种情况下 起作用。因此,即使您还将使用安全管理器或工具,也应始终使用关闭挂钩。



 类似资料:
  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单

  • 问题内容: 如果我在无限循环中有一个线程,有没有办法在主程序结束时(例如,当我按 +时 )终止它? 问题答案: 检查这个问题。正确答案对如何以正确的方式终止线程有很好的解释: 是否有任何方法可以杀死Python中的线程? 要使线程在键盘中断信号(ctrl + c)上停止,您可以在退出之前捕获异常“ KeyboardInterrupt”并进行清除。像这样: 这样,您可以控制程序突然终止时的处理方式。

  • 问题内容: 除了堆转储(java_pid14941.hprof),Java 6还会生成线程转储吗? 这就是我的一个应用程序发生的事情。 java.lang.OutOfMemoryError:超出了GC开销限制将堆倾倒到java_pid14941.hprof … 我确实在工作目录中找到了ava_pid14941.hprof,但没有找到任何包含线程转储的文件。当我收到此OutOfMemory错误时,我

  • 请帮助我处理这个主线程/父线程将触发子线程。如果我们停止父线程/主线程,它还必须停止所有子线程/子线程 我想用中断做这件事,但做不到。请帮我把代码弄出来 以及如何确保所有子线程都已停止?有什么办法也可以做到这一点吗 提前谢谢! 我正在尝试这样做: 公共类ThreadTest1扩展Thread{私有静态最终记录器LOGGER=Logger.get记录器(mylogger); }

  • 所以,我刚刚将我的NVIDIA图形驱动程序(GeForce game ready驱动程序)更新到378.49,现在当我尝试构建任何Java项目时,我得到了这个错误: 有人知道解决这个问题的办法吗?

  • 主要内容:1 什么是Java终止线程,2 Thread类终止线程的方法,3 Java终止线程的例子1,4 Java终止线程的例子2,5 Java终止线程的例子3,6 isInterrupted和interrupted方法1 什么是Java终止线程 如果任何线程处于睡眠或等待状态(即,调用sleep()或wait()方法),则在线程上调用interrupt()方法,会抛出InterruptedException中断睡眠或等待状态。如果线程未处于睡眠或等待状态,则调用interrupt()方法将执行