JVM源码分析之javaagent原理完全解读
本文来自 PerfMa社区,欢迎关注公众号 链接:https://club.perfma.com/article/150614 问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundExcep...