jvm学习-ClassLoader(二)

ClassLoader结构

jdk加载的4个步骤

CustomClassLoader 用户自定义的classLoader

APPClassLoader主要加载classPath下面的class

Extension ClassLoader 主要负责加载JAVA_HOME/jre/lib/ext/目下的所有jar

       BootStrap ClassLoader:负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等

java类加载器采用双亲委托模式

则是从下级往上级询问是否有加载。如果没加载 再从上级往下下级查找 如果找到就加载 没有找到就继续向下询问

比如 在程序创建一个Test类。然后在main方法打印这个这个Test类的classLoader 会打印 APPClassLoader

因为appClassLoader会逐个向上询问是否加载  则都没有加载  然后从上级bootstrap到Extension ClassLoader会在他的扫描的jar里面找有没有Test这个class都没有找到 最终APPClassLoader在classPath找到这个类  加载

我们改变一下程序 将Test类打包成一个jar 放到ext目录下

再次打印则会输出加载类是Extension ClassLoader

双亲委托模式的好处

1. 防止重复加载

缺点 :

上层类加载器无法获得下层类加载器加载的类

双亲委托模式是jdk的默认实现 但是不一定要完全按照这个模式

比如tomcat webappClassLoader 就会先加载自己的class  找不到再委托父类

自定义ClassLoader 必须继承 classLoader类

   classLoader的重要方法

                    loadClass(String name)文件名字

     defineCalss(byte[] b int off,int lent) class文件的内容

        findClass() loadClass会掉findClass方法

     findLadedClass(String name) 如果加载了 则不加载 没加载 才加载

为什么要重写classLoader

因为默认实现的几种classLoader只会加载特定路径下面的class     我们往往会根据需求加载别的路径下的class 比如网络请求的class二进制信息

原文地址:https://www.cnblogs.com/LQBlog/p/9200926.html

时间: 2024-10-11 05:42:06

jvm学习-ClassLoader(二)的相关文章

java之jvm学习笔记二(类装载器的体系结构)

java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新的解析一次, 第二种,即时解析,也就是转载到内存的字节码会被解析成本地机器码,并缓存起来以提高重用性,但是比较耗内存, 第三种,自适应优化解析,即将java将使用最贫乏的代码编译成本地机器码,而使用不贫乏的则保持字节码不变,一个自适应的优化器可以使得java虚拟机在80%-90%的时间里执行优化过的

jvm学习笔记二(减少GC开销的建议)

一:触发主GC(Garbage Collector)的条件 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大.更值得关注的是主GC的触发条件,因为它对系统影响很明显.总的来说,有两个条件会触发主GC: 1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用.因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外. 2)Java堆内存不足时,GC会被调用.当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强

JVM学习系列(二) 垃圾回收

如何判断对象是否可回收 引用计数法 1.概念:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器的值+1,当引用失效的时候,计数器-1,任何时刻计数器为0的对象就是不可以在被使用的对象. 2.缺点:无法解决对象循环引用的问题(如下图) 可达性分析法 1.概念:垃圾回收根节点(GCRoot)向下搜索,搜索所走过的路径称为引用链,当一个对象对GCRoot没有任何的引用链时,代表当前对象不可用. 2.GCRoot包含的对象: 虚拟机栈(帧栈中的本地变量表)中的引用的对象 方法区类静态属性 所引

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

JVM 学习笔记(二)

JVM 堆中几乎存放着java中所有的对象实例,在在垃圾回收前先要判断对象是否已死,这里对对象的判断主要有: 1.  引用计数法 给对象中添加一个引用计数器,每当有一个地方引用他时,计数器就加1:当引用失效时,计数器就减1.任何时间计数器为0时,对象就不可能在次使用. 2.  根搜索法 通过一系列的名为GC Roots 作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链时,则说明此对象时不可到达的. 可以作

JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?是不是虚拟机内存越大越好? Java 7之前和Java 8的堆内存结构 Java栈的分配参数 GC算法思想介绍 –GC ROOT可达性算法 –标记清除 –标记压缩 –复制算法 可触及性含义和在Java中的体现 finalize方法理解 Java的强引用,软引用,弱引用,虚引用 GC

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

JVM学习笔记:虚拟机的类加载机制

JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 → 解析)→ 初始化 → 使用 →  卸载. 1 加载 1.1 加载阶段要做的3件事情 通过一个类的全限定名来获取该类对应的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区的数据结构. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

JavaSE 第二次学习随笔(二)

循环结构中的多层嵌套跳出 targeta: for(int i = 0; i < 100; i++){ for (int j = 0; j < 100; j++) { if(i + j == 100){ // break targeta; continue targeta; } } } 数组 * 一维数组里边存的是值(直接数据) 二维数组里边存的是一维数组的地址 * 二维数组和一维数组一样都是数据类型 二维数组类型的构成: 数据类型 + [] + [] 创建格式 type [][] name