文章目录

  • Pre
  • jstack
  • Thread dump
  • Dead Lock 分析
  • 分析代码
  • 解决

Pre

JVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】


jstack

jstack主要用来查看某个Java进程内的线程堆栈信息 ,建议多杀几次线程dump ,每次都有某个事件,基本没跑了~

用法也很简单


Thread dump


Found one Java-level deadlock:
=============================
"T-ShortConn-4":waiting to lock monitor 0x00007f87e1d95718 (object 0x00000006cc86c090, a java.lang.Class),which is held by "T-ShortConn-0"
"T-ShortConn-0":waiting to lock monitor 0x00007f875c00f188 (object 0x00000006c6f34238, a java.util.concurrent.ConcurrentHashMap),which is held by "localhost-startStop-1"
"localhost-startStop-1":waiting to lock monitor 0x00007f87e1d95718 (object 0x00000006cc86c090, a java.lang.Class),which is held by "T-ShortConn-0"Java stack information for the threads listed above:
===================================================
"T-ShortConn-4":at com.artisan.bus.tool.redis.RedisClusterHelper.getClient(RedisClusterHelper.java:38)- waiting to lock <0x00000006cc86c090> (a java.lang.Class for com.artisan.bus.tool.redis.RedisClusterHelper)at com.artisan.bus.tool.redis.RedisClusterHelper.listOs(RedisClusterHelper.java:328)at com.artisan.bus.tool.redis.RedisClusterHelper.lSize(RedisClusterHelper.java:193)at com.artisan.bus.service.comunication.CommunicationService.send(CommunicationService.java:1922)at com.artisan.bus.service.comunication.CommunicationService$$FastClassBySpringCGLIB$$cacacc60.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)at com.artisan.bus.service.comunication.CommunicationService$$EnhancerBySpringCGLIB$$8902c097.send(<generated>)at net.artisan.manager.DataProcessorManager.send(DataProcessorManager.java:850)at net.artisan.manager.DataProcessorManager.processShortLinkData(DataProcessorManager.java:833)at net.artisan.common.ShortLinkProcessorThread.run(ShortLinkProcessorThread.java:22)at java.lang.Thread.run(Thread.java:748)
"T-ShortConn-0":at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:187)- waiting to lock <0x00000006c6f34238> (a java.util.concurrent.ConcurrentHashMap)at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:486)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:432)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:403)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:389)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1002)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:345)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093)at com.artisan.bus.tool.utils.SpringApplicationContext.getBean(SpringApplicationContext.java:31)at com.artisan.bus.tool.redis.RedisClusterHelper.getClient(RedisClusterHelper.java:40)- locked <0x00000006cc86c090> (a java.lang.Class for com.artisan.bus.tool.redis.RedisClusterHelper)at com.artisan.bus.tool.redis.RedisClusterHelper.listOs(RedisClusterHelper.java:328)at com.artisan.bus.tool.redis.RedisClusterHelper.lSize(RedisClusterHelper.java:193)at com.artisan.bus.service.comunication.CommunicationService.send(CommunicationService.java:1922)at com.artisan.bus.service.comunication.CommunicationService$$FastClassBySpringCGLIB$$cacacc60.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)at com.artisan.bus.service.comunication.CommunicationService$$EnhancerBySpringCGLIB$$8902c097.send(<generated>)at net.artisan.manager.DataProcessorManager.send(DataProcessorManager.java:850)at net.artisan.manager.DataProcessorManager.processShortLinkData(DataProcessorManager.java:833)at net.artisan.common.ShortLinkProcessorThread.run(ShortLinkProcessorThread.java:22)at java.lang.Thread.run(Thread.java:748)
"localhost-startStop-1":at com.artisan.bus.tool.redis.RedisClusterHelper.getClient(RedisClusterHelper.java:38)- waiting to lock <0x00000006cc86c090> (a java.lang.Class for com.artisan.bus.tool.redis.RedisClusterHelper)at com.artisan.bus.tool.redis.RedisClusterHelper.del(RedisClusterHelper.java:63)at com.artisan.bus.dao.impl.settings.template.strategy.StrategyTemplateDao.cacheStrategyTemplate(StrategyTemplateDao.java:173)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)at com.sun.proxy.$Proxy82.cacheStrategyTemplate(Unknown Source)at com.artisan.bus.service.impl.task.CheckTaskService.cacheStrategyTemplate(CheckTaskService.java:3658)at com.artisan.bus.service.impl.task.CheckTaskService$$FastClassBySpringCGLIB$$b794226f.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)at com.artisan.bus.service.impl.task.CheckTaskService$$EnhancerBySpringCGLIB$$7b018424.cacheStrategyTemplate(<generated>)at com.artisan.bus.web.filter.ApplicationConfigue.setApplicationContext(ApplicationConfigue.java:74)at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:121)at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:97)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)- locked <0x00000006c6f34238> (a java.util.concurrent.ConcurrentHashMap)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)- locked <0x00000006c6f655a8> (a java.lang.Object)at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668)at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634)at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682)at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553)at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494)at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)at javax.servlet.GenericServlet.init(GenericServlet.java:158)at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1269)- locked <0x00000006c6d54a78> (a org.apache.catalina.core.StandardWrapper)at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182)- locked <0x00000006c6d54a78> (a org.apache.catalina.core.StandardWrapper)at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072)- locked <0x00000006c6d54a78> (a org.apache.catalina.core.StandardWrapper)at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660)- locked <0x00000006c54f5f78> (a org.apache.catalina.core.StandardContext)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)- locked <0x00000006c54f5f78> (a org.apache.catalina.core.StandardContext)at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1260)at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2002)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Found 1 deadlock.

Dead Lock 分析

jstack 杀出来的线程堆栈, 划重点~~~

Found one Java-level deadlock:
=============================
"T-ShortConn-4":waiting to lock monitor 0x00007f87e1d95718 (object 0x00000006cc86c090, a java.lang.Class),which is held by "T-ShortConn-0"
"T-ShortConn-0":waiting to lock monitor 0x00007f875c00f188 (object 0x00000006c6f34238, a java.util.concurrent.ConcurrentHashMap),which is held by "localhost-startStop-1"
"localhost-startStop-1":waiting to lock monitor 0x00007f87e1d95718 (object 0x00000006cc86c090, a java.lang.Class),which is held by "T-ShortConn-0"Java stack information for the threads listed above:
===================================================

三个线程 T-ShortConn-4 、 T-ShortConn-0 和 localhost-startStop-1

看括号里面的 object xxxxxxx

  • T-ShortConn-4 想去获取lock 【object 0x00000006cc86c090】 , 但这个lock被 T-ShortConn-0持有
  • T-ShortConn-0 想去获取lock 【object 0x00000006c6f34238】 , 但这个lock被 localhost-startStop-1持有
  • localhost-startStop-1 想去获取lock 【object 0x00000006cc86c090】 , 但这个lock被 T-ShortConn-0持有

====》得出结论

  • T-ShortConn-0 持有的lock 【0x00000006cc86c090】 被 T-ShortConn-4 和 localhost-startStop-1 需要

  • localhost-startStop-1 持有的lock 【0x00000006c6f34238】 被 T-ShortConn-0 需要

这不就产生deal lock了么?


分析代码

T-ShortConn-0 持有的lock 【0x00000006cc86c090】 那就去dump中查找这个关键字吧

at com.artisan.bus.tool.utils.SpringApplicationContext.getBean(SpringApplicationContext.java:31)at com.artisan.bus.tool.redis.RedisClusterHelper.getClient(RedisClusterHelper.java:40)- locked <0x00000006cc86c090> (a java.lang.Class for com.artisan.bus.tool.redis.RedisClusterHelper)

localhost-startStop-1 持有的lock 【0x00000006c6f34238】


DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:187) 返回的是一个 ConcurrentHashMap , lock类型就是 ConcurrentHashMap。

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)- locked <0x00000006c6f34238> (a java.util.concurrent.ConcurrentHashMap)

解决

解决方法: 提前初始化RedisClusterHelper这个单例

Java - 死锁 Dead Lock 定位分析相关推荐

  1. Java多线程之死锁编码及定位分析

    Java多线程之死锁编码及定位分析 目录 死锁是什么 代码实现 死锁解决办法 1. 死锁是什么 死锁是指两个或两个以上的进程在执行过程中因争夺资而造成的一种互相等待的现象,若无外力干涉那它们都将无法推 ...

  2. c++11 多线程编程(四)------ 死锁(Dead Lock)

    死锁 如果你将某个mutex上锁了,却一直不释放,另一个线程访问该锁保护的资源的时候,就会发生死锁,这种情况下使用lock_guard可以保证析构的时候能够释放锁,然而,当一个操作需要使用两个互斥元的 ...

  3. java安全编码指南之:死锁dead lock

    文章目录 简介 不同的加锁顺序 使用private类变量 使用相同的Order 释放掉已占有的锁 简介 java中为了保证共享数据的安全性,我们引入了锁的机制.有了锁就有可能产生死锁. 死锁的原因就是 ...

  4. 死锁编码及定位分析(故障排查)

    什么是死锁? 在Java中使用多线程,就会有可能导致死锁问题.死锁会让程序一直卡住,不再程序往下执行.我们只能通过中止并重启的方式来让程序重新执行. 造成死锁的原因: 当前线程拥有其他线程需要的资源 ...

  5. java的死锁是什么意思_Java面试题:什么是死锁?如何手写一个死锁(Dead Lock)...

    要想实现一个死锁,首先要明白什么是死锁,我们看一下死锁的定义: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称 ...

  6. javacore分析工具_线上死锁定位分析

    " 记录一次线上死锁的定位分析."        昨晚睡觉前提了点代码到 jfoa(https://github.com/JavaFamilyClub/jfoa) 怎么也没想到导致 ...

  7. java面试-死锁产生、定位、修复

    死锁发生:两个或多个线程之间,互相持有对方需要的锁,而永久处于阻塞状态 一.手写死锁代码: public class DeadLockSample extends Thread {private St ...

  8. java 分析java死锁_Java死锁示例–如何分析死锁情况

    java 分析java死锁 死锁是两个线程或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,它将导致死锁情况,然后我们将看到如何对其 ...

  9. java 分析java死锁_有益的CountDownLatch和棘手的Java死锁

    java 分析java死锁 您是否曾经使用过java.util.concurrent.CountDownLatch ? 这是在两个或多个线程之间实现同步的非常方便的类,在该类中,一个或多个线程可以等待 ...

最新文章

  1. 2021年大数据ELK(六):安装Elasticsearch
  2. rhel6Inode详解
  3. 对java多线程里Synchronized的思考
  4. Android开发--Wifi的操作
  5. LeetCode 71. 简化路径(栈)
  6. java变量命名规则_变量的概念和声明
  7. Linux超简单文本编辑器:nano
  8. python实现顺序查找和哈希查找算法
  9. Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
  10. 拓端tecdat|R语言中的岭回归、套索回归、主成分回归:线性模型选择和正则化
  11. symbian 如何在安装时备份sis文件
  12. 十首中国现代诗,很美!
  13. java8 .stream().anyMatch / allMatch / noneMatch用法
  14. 微信视频号自助下单刷平台
  15. __call__ 的用法
  16. 电影解说类自媒体如何才能脱颖而出
  17. 气动调节阀的结构特点
  18. firedaemon.exe
  19. 人生没有我并不会不同--IOPS OSL个人日志(作者:V`shadow.hattie)
  20. 定型“体验+大数据”模式 大悦城走出“弯路”

热门文章

  1. 二次探测再散列举例_二次探测散列法
  2. 再谈编程范式-程序语言背后的思想
  3. 二分图带权最大匹配费用流_一文掌握阻抗匹配
  4. Leetcode 198.打家劫舍 (每日一题 20210622)
  5. 重要性采样原理及实现
  6. 李宏毅线性代数笔记9:特征值与特征向量
  7. 贝叶斯学习--极大后验假设学习
  8. android 9patch 漏洞,Android 9patch 图片解析堆溢出漏洞分析(CVE-2015-1532)
  9. 博图只能通过地址相同设备找到plc_小白求教:博途v13无法连接s7-1200,显示在网络上未找到任何设备...
  10. Ubuntu基础知识