类加载器分析(JVM)

最近去了解了下关于java虚拟机中的加载机制,特地写了篇blog来记忆下。

首先我们来了解下概念,什么是类加载器?

A:加载器就是把java的字节码从硬盘中加载到内存,然后再做一些处理,这就是类加载器所做的一些工作

默认情况下:java有默认的三个类加载器,(树状结构)从上到下分别是bootStrap、ExtClassLoader、AppClassLoader三个加载器

本质上java的类加载器为一个java类,当然也有一个是特殊的,就比如说第一个加载器bootStrap是用C++写的

优先级是从上到下:可以看下代码了解下:

package zju.zsq.day01;

public class ClassLoaderTest {

	public static void main(String[] args) {

		System.out.println(
				ClassLoaderTest.class.getClassLoader()
				.getClass().getName());
		System.out.println(
				System.class.getClassLoader()
				);

		ClassLoader loader = ClassLoaderTest.class.getClassLoader();
		//看下树状结构,如果为null就代表找不到java的class文件,等于找到了bootstrap(C++实现的加载)
		while(loader != null){
			System.out.println(loader.getClass().getName());
			loader = loader.getParent();
		}
		System.out.println(loader);
		/**
		 * AppClassLoader:只从classpath指定的目录或者jar包下面加载类
		 * ExtClassLoader:JRE/lib/ext/*.jar
		 * BootStrap:专门加载JRE/lib/rt.jar
		 */
	}
}

bootStrap:

ExtClassLoader:

AppClassLoader:

说了那么多,让我们看看java虚拟机加载一个类的时候,到底派出哪个类加载器去加载呢?

一般来说当前线程的类加载器去加载线程中的第一个类, 比如说当前的

ClassLoaderTest类,他是先让appClassLoader去加载,然后,appClassLoader委托给extClassLoader加载,然后extClassLoader委托给bootStrap加载,

而bootStrap找不到加载,又扔给extClassLoader加载,extClassLoader同样加载不了,又委托给appClassLoader加载,而appClassLoader刚好可以加载,就加载完成了

当然,如果说前面的爷爷,或者爸爸可以加载就不会让树状图下面的家宅器来加载了。如果到了appClassLoader还加载不了,那么就是runtimeError(classNotFoundException)

这就是委托机制,可以方便集中管理,不会生成多分字节码(class文件)

当然比如说当前线程是ClassLoaderTest类。那么,

如果ClassLoaderTest类引用了B类,那么就用ClassLoaderTest类的加载器去加载B类。

也可以直接调用哪个类加载器来加载 如 ClassLoader.loadClass()来指定具体某个加载器来加载类

我还记得有一道面试题特别经典。

就是能不能自己重写java.lang.System

我觉得吧,应该这样回答。当然是可以,但是你写了也是白写,因为重写后,根据委托机制,最后调用的还是系统原来的

除非自己写一个类加载器,而且这个类加载器还要比较特殊,要抛开委托机制。

我觉得应该是这样答的,

类加载器分析(JVM)

时间: 2024-10-19 17:21:01

类加载器分析(JVM)的相关文章

线程上下文类加载器分析与实现

在上一次[https://www.cnblogs.com/webor2006/p/9246850.html]分析源码中发现有两处设置线程上下文类加载器的代码,如下: 因为它是非常重要的东东,所以这次专门对它进行主题展开,主要的作用为了改变委托双亲模式在某些场景不太适用或者是无法满足需求的,下面先写一个简单的测试代码: 那输出是啥呢? 也就是说当前线程的上下文类加载器是应用类加载器,而第二输出null不足为奇,因为Thread是JDK中的系统类当然是由启动类加载器加载喽. 对于上面的例子先有一个初

(二十七)JVM类加载器机制与类加载过程

一.Java虚拟机启动.加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程. package org.luanlouis.jvm.load; import sun.security.pkcs11.P11Util; /** * Created by louis on 2016/1/16. */ public class Main{ public static void main(String[] args) { System.out.println(

JVM类加载器原理与自定义类加载器

类加载器原理 JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口. 类缓存 标准的Java SE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间.不过,JVM垃圾收集器可以回收这些Class过象. 类加载器数状结构 引导类加载器(bootstrap class loader) 它用来加载Java的核心库(JAVA_HOME/

十四.jvm类加载器

什么是类的加载? 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 1.加载.class文件的方式 从本地系统中直接加载 通过网络下载.class文件 从zip,jar等归档文件中加载.class文件 从专有数据库中提

jvm 垃圾收集器分析

jvm 垃圾收集器分析 jvm 垃圾收集器分析   新生代收集器 老年代收集器 优点 缺点 serial收集器 V   1.jdk1.3开始的单线程收集器 2.client模式下很好的选择. 3.复制算法 1.单线程,收集时需要暂停所有线程(stop the world) parNew收集器 V   1.serial的多线程版 2.server模式下 3.可与CMS收集器工作 4.线程数与cpu数相同 1.单CPU下不会比serial收集器性能好   Parallel Scavenge 收集器

深入拆解类加载器,这样的姿势你还不懂吗?

本文导读: 1.前奏,举个生活中的小栗子 2.为何Java类型加载.连接在程序运行期完成? 3.一个类在什么情况下才会被加载到JVM中? 什么是主动使用.被动使用?代码示例助你透彻理解类初始化的时机. 4.类的加载(Loading)内幕透彻剖析 类加载做的那些事儿.双亲委派模型工作过程.ClassLoader源码解析 5.Tomcat如何打破双亲委派模型的 6.上下文类加载器深入浅出剖析 7.最后总结 1.前奏,举个生活中的小栗子 春节马上要到了,大家是不是都在迫不及待的等着回家团圆了呢? 大春

Java中的类加载器

转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制 我们知道,Java是一种动态语言.那么怎样理解这个"动态"呢?或者说一门语言具备了什么特性,才能称之为动态语言呢?对于java,我是这样理解的. 我们都知道JVM(java虚拟机)执行的不是本地机器码指令,而是执行一种称之为字节码的指令(存在于class文件中).这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到内存

java类加载器——ClassLoader

Java的设计初衷是主要面向嵌入式领域,对于自定义的一些类,考虑使用依需求加载原则,即在程序使用到时才加载类,节省内存消耗,这时即可通过类加载器来动态加载. 如果你平时只是做web开发,那应该很少会跟类加载器打交道,但如果你想深入学习tomcat服务器的架构,它是必不可少的.所谓类加载器,就是用于加载Java类到Java虚拟机中,它负责读取Java字节码,并转换成java.lang.Class类的一个实例,使字节代码.class文件得以运行.一般类加载器负责根据一个指定的类找到对应的字节代码,然

类加载器与methodinterceptor接口

类加载器: JVM将类加载过程分为三个步骤: 装载(Load):加载二进制文件 链接(Link)进行了验证:验证文件准确性 准备:将静态变量进行分配内存,初始化其默认值. 解析:符号引用转换为直接引用 初始化(Initialize): 为静态变量赋予正确的值: 1)Bootstrap ClassLoader 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平