一、前言

在各种Tomcat相关书籍,书上都提到了其类加载器结构:

在Tomcat 7或者8中,共享类和Catalina类加载器在catalina.properties中都是没配置的,请看:

所以,catalina和shared是直接把common的类加载器赋值给了它们,这三者其实都是同一个类加载器。

这次我们来验证下,方法是通过jmap导出内存堆栈,然后用eclipse 的MAT工具进行分析。

二、步骤

1、获取内存dump

我的tomcat是7.0.68,webapps只有默认的几个应用。

在命令行执行下面语句,获取pid:

 ps -ef|grep java

然后执行:

jmap -dump:live,format=b,file=heap.bin  此处为pid占位符

2、eclipse MAT查找org.apache.catalina.loader.WebappClassLoader

用MAT打开heap.bin后,会让你选择分析的类型,我们选择Component Report即可。

接下来,正式开始分析:

我们知道,tomcat中的应用加载器,类名即为org.apache.catalina.loader.WebappClassLoader。

我们这里,直接用oql语言(eclipse mat中语法)来查询该类的对象:

可以看到,共有5个对象。

5个对象,分别对应了默认的5个应用,manager、host manaer、docs、root、example。

我们选择第一个,查看下图,可知,该classload是为manager应用服务的,其他几个就不一一截图了:

从上图也可以简单看出来,类加载路径就是简单地去自己context目录下的 WEB-INF/lib 、WEB-INF/classes下查找。

(当然,具体的实现没这么简单,会根据类名称以及delegate 参数,选择是给j2seClassLoader加载(加载jre/lib/ext下的),还是给parent

来加载,还是自己加载。)

3、查看WebappClassLoader 的parent 加载器

按照理论上说,WebappClassLoader的parent,即为common类加载器,主要加载tomcat自己的类,即catalina.base中lib下面的类。

我们上图看看:

从图上可以看出来,确实没骗我,加载的类路径确实就是tomcat的lib目录。

我们顺便,验证下,common、server、share都执行同一个引用。下图可以看出来,确实没错。

4、查看common类加载器的parent

我们继续往上追溯,common的parent,应该是jdk的默认类加载器,类型为sun.misc.Launcher$AppClassLoader,主要负责加载classpath下的东西。

这里,看看我们的classpath是哪个:

上图可以看出来,classpath下,只有2个类(忽略greys-agent.jar,那个是调试工具),即bootstrap.jar 和tomcat-juli.jar(Tomcat内部日志)。

到这里,我们的验证基本就结束了。

三、总结

这里,从第四点,我有一些感想,似乎明白了:

为什么tomcat的启动源码里,即bootstrap类中,一上来就要设置线程上下文类加载器。

原因就是,BootStrap是应用类加载器加载的,只加载了Bootstrap和tomcat-juli.jar。而tomcat/lib下没法加载。

所以就马上新建了commonLoader,(和catalinLoader、sharedLoader同一个引用),而且设置为线程类加载器,方便进行后续的类加载。

说实话,但我觉得,tomcat的bootstrp.jar和tomcat-juli.jar为啥不直接放到lib目录下,大家都直接使用common类加载器算了,搞不懂搞不懂。

今天分享就到这。

ps:题外话,为啥上一篇写的openjdk 源码编译、调试的文章,根本没几个人看呢。。。毕生绝学都拿出来了,哭。。

实战分析Tomcat的类加载器结构(使用Eclipse MAT验证)的更多相关文章

  1. Tomcat内核之Tomcat的类加载器

    跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制.一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web ...

  2. Tomcat的类加载器

    看完了Java类装载器,我们再来看看应用服务器(Tomcat)对类加载器的使用,每个应用服务器都有一套自己的类加载器体系,从而与Java的类加载器区别开以达到自己与应用程序隔离的目的.Tomcat的类 ...

  3. 细说tomcat之类加载器

    官网:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.htmlJava类加载与Tomcat类加载器层级关系对比 Java Clas ...

  4. 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码

    先回顾一下classpath classpath的作用: classpath的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从classpath中进行查找这个类. 指 ...

  5. 7. 通过JDBC源码来分析线程上下文类加载器以及SPI的使用

    目录 1. 什么是全盘负责委托机制 2. 为什么需要有线程上下文类加载器 2.1 使用JDBC的例子,分析为什么双亲委托机制不能实现要求 2.2 线程上下文类加载器的作用 3. 线程上下文类加载器的使 ...

  6. JVM源码分析之自定义类加载器如何拉长YGC

    概述 本文重点讲述毕玄大师在其公众号上发的一个GC问题一个jstack/jmap等不能用的case,对于毕大师那篇文章,题目上没有提到GC的那个问题,不过进入到文章里可以看到,既然文章提到了jstac ...

  7. 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

    当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...

  8. 还是Tomcat,关于类加载器的趣味实验

    一.前言 类加载器,其实是很复杂一个东西,想等到我完全什么都弄明白了再写出来,估计不太现实...现在只能是知道多少写多少吧. 首先,我提一个问题:在我们自己的servlet中(比如ssm中,contr ...

  9. 不吹不黑,关于 Java 类加载器的这一点,市面上没有任何一本图书讲到

    类加载器第7弹: 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 了不得,我可能发现了Jar 包冲突的秘密 重写类加载器,实现简单的热替 ...

随机推荐

  1. (五)maven之外置maven

    eclipse外置maven eclipse内置的maven插件是固定版本,如果要用其他版本的maven,可以使用外置maven. ①    在菜单栏上点击“Windows”à“Preferences ...

  2. 《算法图解》中涉及的算法的总结及java实现

    该项目源代码已经放到Github上,有兴趣可以点击AlgorithmGraphExample 进行访问 项目启动,项目使用maven搭建,如果不使用maven导入,请保证有Junit4的jar包在工程 ...

  3. 电脑上文件的后缀名被隐藏,把一个文本文件改成.bat时,默认打开的还是文本。

    1.打开文件夹,选择组织,点击“文件夹和搜索选项”,如图: 2.选择“查看”,找到“隐藏已知文件类型的扩展名”,不要勾选这一项,如图: 3.点击“确定”或者“应用”

  4. 实现类似AOP的封装和配置

    这是张孝祥老师Java进阶讲解中最后一个视频,就是实现类似spring中的AOP的封装和配置,特别特别小型的一个框架雏形,但是spring中的核心思想还是体现出来了,真的厉害,张老师!!! 一.重点知 ...

  5. shell脚本,一个shell的启动流程。

    #一个shell的启动流程 #shell有一些变量,叫做环境变量,这些变量是可以继承的, #比如父shell有$UID,子shell也可以有,而且继承父shell的. #正常我们声明一个变量,a=,在 ...

  6. java第九次作业:第九章例题3个

    作业1: 例题9.1 制作圆类,根据圆的半径求出周长及面积 package com.swift; //抽象的方法构成类,把属性和方法进行封装 public class Circle { // 两个方面 ...

  7. LeetCode695--岛屿的最大面积

    ''' 岛屿的最大面积 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着 ...

  8. 如何完整反编译AndroidMainfest.xml

    下载工具: http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter.zip&can=2&q= 包名为 ...

  9. adb 命令大全

    传送门 --> https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的 ...

  10. Java-在JVM关闭前调用的函数

    参考:http://qtlkw.iteye.com/blog/1018872 package com.tj; import java.text.SimpleDateFormat; import jav ...