目录 1. 什么是全盘负责委托机制 2. 为什么需要有线程上下文类加载器 2.1 使用JDBC的例子,分析为什么双亲委托机制不能实现要求 2.2 线程上下文类加载器的作用 3. 线程上下文类加载器的使用 3.1 线程上下文类加载器使用API 3.2 线程上下文类加载器的特征 3.3 线程上下文类加载器使用的通用写法 4. 借助JDBC源码分析上下文类加载器的使用 4.1 示例代码 4.2 源码分析 4.2.1 首先解析第一句 Class.forName("com.mysql.jdbc.Drive…
关于线程上下文类加载器已经在之前学得比较透了,作为一个收尾,这里用平常J2EE开发时JDBC连接Mysql数据库常见的一段代码通过分析它的底层进一步加深对线程上下文类加载器的理解,所以先来将连接应用代码写上,注意:这里不力求真正的去完成数据的连接,重在在分代码,如下: 说实话如今的工作重点是搞android的开发,再来看上面的这段代码还是非常之亲切的,当然啦搞J2EE开发的那就不用多说了,家常便饭了,好,接下来先来分析第一行代码: 对于mysql驱动有两个: 而我们使用的是第一个,对于forNa…
前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器ContextClassLoader内存泄漏相关的Issue: ThreadDeathWatcher causes custom classLoader script memory leaks Ensure ThreadDeathWatcher and GlobalEventExecutor will no…
摘要: 博文<深入理解Java类加载器(一):Java类加载原理解析>提到的类加载器的双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的类加载器的实现方式.在Java世界中的大部分类加载器都遵从这个模型,但这个模型并不能解决 Java 应用开发中会遇到的类加载器的全部问题,这便是本文要阐述的内容. 版权声明: 本文作者:书呆子Rico  作者博客地址:http://blog.csdn.net/justloveyou_/ 一.线程上下文类加载器 线程上下文类加载器(cont…
当前类加载器(Current ClassLoader) 每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(指所依赖的类) 如果ClassX引用了ClassY,那么ClassX的类加载器就会去加载ClassY(前提是ClassY尚未被加载) 线程上下文加载器(Context Classloader) 线程上下文加载器是从JDK1.2开始引入,类Thread中的getContextLoader() 与setContextClassLoader(ClassLoader cl) 分别用…
有许多地方能够看到线程上下文类加载的设置,比如在sun.misc.Launcher类的构造方法中,能够看到如下代码 先写一个例子建立感性认识 public class Test { public static void main(String[] args) { System.out.println(Thread.currentThread().getContextClassLoader()); System.out.println(Thread.class.getClassLoader());…
前言 目前学习到的类加载的知识,都是基于[双亲委托机制]的.那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗? 答案是否定的. JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载器. 1.引出[线程上下文类加载器] 我们来复习一下JDBC执行SQL的代码[画外音:感觉回到了大学自学Java的时候]: Connection conn = DriverManager.getConnection(url, user, password); String sql = "insert…
1.线程上下文类加载器是从jdk1.2开始引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader c1),分别用来获取和设置类加载器如果没有通过setContextClassLoader方法进行设置的话,线程将继承其父线程的上下文加载器,java应用运行时的初始线程的上下文类加载器是系统类加载器(这里是由Launcher类设置的).在线程中运行的代码可以通过该类加载器来加载类和资源2.线程上下文类加载器的重要性…
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecutor类中存在一个workers工作线程集合,用户可以向线程池中添加需要执行的任务,workers集合中的工作线程可以直接执行任务,或者从任务队列中获取任务后执行.ThreadPoolExecutor类中提供了整个线程池从创建到执行任务,再到消亡的整个流程方法.本文,就结合ThreadPoolExe…
一.前言 在各种Tomcat相关书籍,书上都提到了其类加载器结构: 在Tomcat 7或者8中,共享类和Catalina类加载器在catalina.properties中都是没配置的,请看: 所以,catalina和shared是直接把common的类加载器赋值给了它们,这三者其实都是同一个类加载器. 这次我们来验证下,方法是通过jmap导出内存堆栈,然后用eclipse 的MAT工具进行分析. 二.步骤 1.获取内存dump 我的tomcat是7.0.68,webapps只有默认的几个应用.…