首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法在Oracle异常时触发JVM线程转储?

有没有办法在Oracle异常时触发JVM线程转储?
EN

Stack Overflow用户
提问于 2011-10-24 10:18:58
回答 2查看 1.8K关注 0票数 2

我们有一个在Websphere中运行的Java程序,并使用直接使用jdbc (没有Hibernate或JPA)的Oracle数据库。我们的客户正在使用HP Performance Center进行负载测试,但他在负载下偶尔会遇到Oracle“死锁”异常

代码语言:javascript
代码运行次数:0
运行
复制
Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource

有没有办法,无论是在代码中还是在外部,当这个异常发生时,强制执行kill -3时得到的相同类型的线程转储?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 10:36:19

如果不能自动检测异常发生的时间,那么知道如何枚举线程就没有多大用处。

我们一直都在这么做。我们基本上是在使用:

代码语言:javascript
代码运行次数:0
运行
复制
Thread.setDefaultUncaughtExceptionHandler

当我们的应用程序启动,然后当一个异常发生时,我们转储我们想要的信息:

  • Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();
  • Runtime.getRuntime().freeMemory()/ maxMemory() / totalMemory()用于获取基本内存信息
  • 用户使用模式如果它是用户可以交互的应用程序

然后,您可以调用许多其他的东西,并获得花哨的东西。例如,我们会自动将崩溃报告(包括完整的堆栈跟踪)发送到等待此类跟踪的服务器。

票数 7
EN

Stack Overflow用户

发布于 2011-10-24 10:29:55

对于当前线程,可以使用Thread.dumpStack()

对于所有线程,您可以使用Thread.enumerate()获取所有正在运行的线程,并使用dumpStack()处理每个线程,也可以使用Thread.getAllStackTraces()并将它们打印到控制台或任何需要的地方。

要在这些异常发生时发生这种情况,如果你不能在自己的代码中做到这一点,你可以尝试AOP,编写一个代理(如果你使用的是Java 6+),或者你可以在必要时获取SQLException的源代码,将其更改为将堆栈转储到其构造函数中,重新编译并将该类放回引导类路径中。

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

https://stackoverflow.com/questions/7870764

复制
相关文章

相似问题

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