有没有办法在Oracle异常上触发jvm线程转储?

Pau*_*lin 2 java oracle websphere deadlock

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

Caused by: java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource
Run Code Online (Sandbox Code Playgroud)

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

Ced*_*tin 7

如果在异常发生无法自动检测到,知道如何枚举线程将没有多大用处.

我们一直这样做.我们基本上使用:

Thread.setDefaultUncaughtExceptionHandler
Run Code Online (Sandbox Code Playgroud)

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

  • Map<Thread, StackTraceElement[]> mst = Thread.getAllStackTraces();

  • Runtime.getRuntime().freeMemory()/ maxMemory()/ totalMemory()获得基本内存的相关信息

  • 用户使用模式,如果它是用户可以与之交互的应用程序

  • 自制的"分析"

  • 等等

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