java虚拟机-类加载机制

目录

虚拟机的类加载机制

Java类加载器

启动类加载器

扩展类加载器 

应用程序类加载器 

双亲委派模型

源码

类加载器运行原理

自定义类加载器


 

虚拟机的类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为类加载器

Java类加载器

Java类加载器(Java Classloader)负责动态地将Java类加载到Java虚拟机的内存空间内, 是Java运行时环境(Java Runtime Environment)的一部分,JVM默认有3个类加载器,每个类加载器负责加载特定位置的Java类

启动类加载器

1、Bootstrap ClassLoader(引导类或启动类加载器)该类加载器通常由C++语言实现,不继承任何Java类,负责加载System.getProperty("sun.boot.class.path")所指定核心Java库也可以通过java -Xbootclasspath指定其搜索路径

public class Test {
	public static void main(String[] args) {
		System.out.println(System.getProperty("sun.boot.class.path"));
	}
}

结果:

D:\Program_Files\Java\jdk1.8.0_131\jre\lib\resources.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\rt.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\sunrsasign.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jce.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\classes

扩展类加载器 

2、ExtClassLoader(扩展类加载器)该类加载器由sun.misc.Launcher$ExtClassLoader实现,负责加载System.getProperty("java.ext.dirs")所指定的Java的扩展库也可以通过java -Djava.ext.dirs指定其搜索路径,例如:java -Djava.ext.dirs=d:\classes HelloWorld;注意:如果将自己开发的 jar 文件放在System.getProperty("java.ext.dirs")所指定的目录中,也会被 ExtClassLoader类加载器加载;

public class Test {
	public static void main(String[] args) {
		System.out.println(System.getProperty("java.ext.dirs"));
	}
}

结果:

D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext;
C:\Windows\Sun\Java\lib\ext

应用程序类加载器 

3、AppClassLoader(系统类或应用程序类加载器)该类加载器由sun.misc.Launcher$AppClassLoader实现,负责加载System.getProperty("java.class.path")或CLASSPATH环境变量所指定的Java类,也可以加上-cp来覆盖原有的classpath设置,例如: java -cp ./classes HelloWorld;说明:默认情况下自定义类都由该类加载器加载。如果应用程序中没有自定义的类加载器,一般情况下这就是程序中默认的类加载器。

public class Test {
	public static void main(String[] args) {
		System.out.println(System.getProperty("java.class.path"));
	}
}

结果:

D:\Program_Files\Java\jdk1.8.0_131\jre\lib\resources.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\rt.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jce.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-32.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;
D:\Program_Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;
D:\workspace\test\bin ****自命名类所存在的路径

 

双亲委派模型

Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织: 除了顶层的启动类加载器以外,其他的类加载器都应当有自己的父类加载器。

public class Test {

	public static void main(String[] args) {
		
		ClassLoader classLoader =Test.class.getClassLoader();
		System.out.println(classLoader.getClass().getName());//控制台输出结果sun.misc.Launcher$AppClassLoader
		
		
		classLoader=classLoader.getParent();
		System.out.println(classLoader.getClass().getName());//控制台输出结果sun.misc.Launcher$ExtClassLoader
		
		classLoader=classLoader.getPa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值