「java死锁排查工具」死锁检测工具
本篇文章给大家谈谈java死锁排查工具,以及死锁检测工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
程序中如何发现死锁,避免死锁,以及发现死锁怎么处理
(看标签只有java和mysql的,就挑出来说了,其他方面的我也没啥可以说的...)
运行时发现死锁:
java进程用jstack打出堆栈看看有没有就知道有没有死锁
mysql innodb的话,show engine innodb status 看看锁持有情况也能看的出来有没有死锁
怎么处理:首先肯定优先恢复服务。该回滚版本的回滚版本,该杀的杀,该重启的重启。
java进程:看jstack的堆栈找到阻塞的位置,然后对着代码分析
mysql:show engine innodb status已经可以看的到sql以及等待什么锁 etc.,对着分析就好,看不到sql的话可以用thread id去查mysql 的bin log查到具体执行的sql。
避免死锁:
我是没什么好的办法,只能说所有涉及到多线程操作的地方都要提高警惕,涉及到资源竞争、加锁的地方都要提高警惕,分析清楚该逻辑会不会产生死锁。
条件允许的情况下可以做并发测试。
如何排查Java内存泄露
1.打开/tomcat_home/bin/catalina.bat文件
2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump,这样当内存溢出是就会在对应路径下生成dump文件
运行程序打开jdk bin 文件夹下再带的 jvisualvm.exe
选择tomcat线程,打开实时监控页面可以看到对应的堆栈线程和装在类,内存的实时情况
运行程序打开jdk bin 文件夹下再带的 jconsole.exe,可以概览堆栈线程和装在类,内存的全部运行时间情况
下载安装mat,dump分析软件,安装后,点击file open 导入dump文件
打开后,灰色区域为可能发生内存溢出的区域,下带问题描述
选择Histogram,点击shallow列进行排序,找出实例最多的
右键实例最的选择list objects-with incoming references,可在根据正则表达式输入自己想查的类,搜索,后右键打开 path to gc root-exclude phantom/weak/soft etc. references 就可以查出 调用为回收的相关信息。
如何通过编程发现Java死锁
在编程中使用ThreadMXBean类来检测死锁
Java 5引入了ThreadMXBean接口,它提供了多种监视线程的方法。我建议您了解所有这些方法,因为当您没使用外部工具时,它们会为您提供很多有用的操作以便您监测程序性能。这里,我们感兴趣的方法是findMonitorDeadlockedThreads,如过您使用的是Java 6,对应的方法是findDeadlockedThreads。二者的区别的是,findDeadlockedThreads还可以检测到owner locks(java.util.concurrent)引起的死锁,而findMonitorDeadlockedThreads只能检测monitor locks(例如,同步块)。由于保留老版本的方法只是出于兼容性的考虑,所以我将使用新版本的方法。在这里,编程的思想是把对死锁的周期性检测封装到一个可重用组件里,之后我们只需启动它、随它去。
一种实现调度的方法是通过执行器框架,即一组良好抽象并易于使用的多线程类。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
this.scheduler.scheduleAtFixedRate(deadlockCheck, period, period, unit);
就是那么简单,在我们通过选择周期和时间单位而设置了一个特定时间后,就得到了一个周期性调用的线程。接着,我们想使功用得以拓展从而允许用户提供在程序检测到死锁时所触发的行为。最后,我们需要一个方法来接收用于描述死锁中所有线程的一系列对象。
void handleDeadlock(final ThreadInfo[] deadlockedThreads);
关于java死锁排查工具和死锁检测工具的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-15,除非注明,否则均为
原创文章,转载请注明出处。