Java类加载机制总结
关于Java类加载机制的几个基本概念:
- JDK提供的基本类加载器:引导类加载器(Bootstrap Class Loader)-用于加载JDK中的核心类、扩展类加载器(Ext Class Loader)-用于加载JRE扩展库目录中的类、系统(应用)类加载器(System/App Class Loader)-用于从启动参数-classpath或环境变量CLASSPATH中加载类;
- 类加载器的树状结构:在JVM中,所有类加载器实例按树状结构组织,根结点为引导类加载器。除根结点外的所有类加载器都有一个非空的父类加载器,从而构成树状结构;
- 双亲委托(代理)模型:当类加载器收到加载类或资源的请求时,通常都是先委托给父类加载器加载,也就是说只有当父类加载器找不到指定类或资源时,自身才会执行实际的类加载过程;
- 类的判等:即使类完全相同(名称相同、字节码相同),不同类加载器实例加载的类对象也是不相等的;这一条规则是Java类加载机制中非常核心且重要的规则,它保证了类加载机制实现“类隔离”、“保护JDK中的基础类”等目标得以实现;
- 线程上下文类加载器机制:在Java中我们和类加载机制打交道的最简单的方法是通过Class.forName方法来加载类,该方法默认情况下是以调用者的类加载器来加载指定的类。这在大多数情况下都足够了,少数情况下我们可以使用和线程关联的类加载器来加载类(即线程上下文类加载器)。线程上下文类加载器通常在实现JDK的SPI或编写框架程序时使用;
- 类的垃圾回收:只有当类加载器可被作为垃圾回收的前提下,其加载的类才有可能被回收;
Java的类加载机制涉及的概念并不多,但是要真正理解,可能还需要花一些功夫。下面以问答的形式谈谈我对Java类加载机制的理解:
- Q:JDK为什么要提供三个类基本类加载器?
- A:由于类加载器本身也是一个类,它也需要加载,这就是引导类加载器必须存在的理由之一;系统类加载器是最常使用的类加载器,用于处理java命令行参数-classpath或环境变更CLASSPATH,有了系统类加载器,大多数Java应用就不需要编写自己的类加载器了;扩展类加载器呢?几乎感觉不到它的存在和作用;
- Q:JDK如何保证类加载器之间形成树状结构?
- A:所有类加载器必须从ClassLoader类派生,该类的构造器保证了所有类加载器一定存在一个父类加载器,这就保证了树状结构的形成。不过,父类加载器其实是可以为null的,Java的类加载机制中将null视为引导类加载器;
- Q:双亲委托模型是必须的吗?
- A:双亲委托模型只能算是JDK的“最佳实践”,自己编写类加载器时,完全可以不遵循双亲委托模型。类似Tomcat这样的WEB容器就实现了与双亲委托模型相反的机制,即加载类时总是先在自身中加载,加载不到时再到父加载器中加载;
- Q:是否可以通过类加载机制实现应用重写JDK中的类?
- A:不可以!自定义的类加载器主要功能是实现字节码的加载,将字节码转换为Class对象的方法是在ClassLoader类中定义的。ClassLoader方法在从字节码构建Class对象的方法中控制了要加载的类名不能以"java."开头;即所有java包及其子包中的类都不允许通过类加载机制重载;
- Q:编写框架程序和普通程序在动态类加载方面有没有什么不同?
- A:普通程序通常不需要考虑类加载机制,如果需要动态加载类,一般使用最简单的Class.forName(String)方法就够了;但编写框架程序时,往往不能这么简单地处理,原因是你不清楚要动态加载的类是否能被加载框架类的类加载器所加载,这时通常可以使用线程上下文类加载器动态加载类;
参考资料:
Java类加载机制总结的更多相关文章
- Java 类加载机制
类的加载: 类的初始化: 类什么时候才被初始化:1)创建类的实例,也就是new一个对象2)访问某个类或接口的静态变量,或者对该静态变量赋值3)调用类的静态方法4)反射(Class.forName(&q ...
- Java类加载机制深度分析
转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...
- 理解Java类加载机制(译文)
理解java类加载机制 你想写类加载器?或者你遇到了ClassCastException异常,或者你遇到了奇怪的LinkageError状态约束异常.应该仔细看看java类的加载处理了. 什么是类加载 ...
- 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制
剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...
- 两道面试题,带你解析Java类加载机制
文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- Java类加载机制及自定义加载器
转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...
- Java类加载机制的理解
算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...
- Java类加载机制与Tomcat类加载器架构
Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...
- 带你解析Java类加载机制
目录 Java类加载机制的七个阶段 加载 验证 准备(重点) 解析 初始化(重点) 使用 卸载 实战分析 方法论 树义有话说 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如 ...
随机推荐
- Uva548 Tree
Tree You are to determine the value of the leaf node in a given binary tree that is the terminal nod ...
- bitset优化FLOYD HDU 3275
Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate, and FJ woul ...
- com.101tec.ZKClient实现中的subscribeDataChanges设置的监听器事件不回调的问题研究
1.如果在Web项目,本身在后台运行,所以注册的事件应该是正常回调的. 2.如果是Application项目,如果是简单的测试,那么运行完之后,整个程序就结束了,程序很快,所以没等到事件回调就关了,解 ...
- zabbix全方位监控MySQL +cacti监控mysql
http://www.linuxidc.com/Linux/2015-02/112690.htm http://john88wang.blog.51cto.com/2165294/1596272?ut ...
- Ubuntu-14.04. sh .py腳本双击無法執行问题的解决方法
Ubuntu-14.04中默认文件用gedit文本打开,而不是BT5里面的默认双击打开四个选择,例如以下图(这是配置完毕后的结果,就不换BT5系统了): 直接文本打开,尽管非常安全.实际生产中肯定是不 ...
- zookeeper+kafka配置
ZooKeeper 安装 #将ZooKeeper解压到/usr/local中 tar –zxvf zookeeper-3.4.6.tar.gz –C /usr/local cd /usr/local ...
- 重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)
学习来源:计蒜客 平衡树 1.定义 对于每一个结点.左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们依照1-n的顺序插入到二叉排序树中,那么二叉排序树就 ...
- Java Web开发基础(1)-Servlet
概述 Servlet技术是对webserver的扩展,要理解这个,可能先了解一下什么是Webserver以及它的功能,特别是它的不足是非常有帮助的,可參考:点击打开链接.另外.Servlet也是一个用 ...
- opencv中RGB转HSV
cvCvtColor(src,dst,CV_BGR2HSV); 当中,src为三通道的,dst也为三通道的. OPENCV 中 H.S.V.顺序分别为3*x+0 3*x+1 3*x+2 open ...
- 产品架构model