JVM学习笔记之类装载器-ClassLoaderjava
本文字数:2300,阅读耗时7分钟bootstrap
JVM体系结构概览安全
负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构而且ClassLoader只负责class文件的加载,至于class文件是否能够容许,则由Execution Engine决定。数据结构
本文是由凯哥Java(WXID:kaigejava)分享《JVM系列教程》jvm
咱们来看看Java类编译成class文件后,文件开头特定的文件标识是什么样的?以下图:ide
类加载器学习
JVM自带的三个类加载器spa
启动类加载器:Bootstrap 使用C++语言写的指针
扩展类加载器:Extension 使用Java语言写的orm
应用程序类加载器:AppclassLoader。Java也叫系统类加载器,加载当前引用的classPath全部类。
用户自定义加载器:
须要继承Java.lang.ClassLoader的子类。
几种类加载器关系以下图:
代码演示:
一:启动类加载器--查看Object的类加载器
执行:
Object obj = new Object();
System.out.println("obj classLoader:"+obj.getClass().getClassLoader());
执行后,咱们发现obj的类加载器是null .以下图:
分析缘由:Object是全部类的父类。是顶级对象。由于是顶级的,全部object的类加载器使用的是bootstrap类加载器。也即调用的是最底层的,因此就是null.
二:查看自定义类的类加载器
自定义一个类:MyObject输出该类的classloader:
sun.misc.Launcher$AppClassLoader.以下图:
咱们能够看到,自定义类的类加载器来自于AppClassLoader.也便是应用服类加载器。
思考:
为何咱们安装jdk以后,就能够直接使用string类、list类等这些类呢?这些类是何时被加载进去的呢?
代开jdk安装目录,找到jre,而后再lib文件夹下找到rt.jar.这个jar就是Java运行时须要的。解压后,咱们找到java.lang.string:
如今知道为何,安装jdk以后,咱们就能够直接使用不少类了吧。由于这些类所在的jar再启动的时候,就被bootstap启动类加载器加载了,因此咱们就能够直接使用了!!
怎么证实rt.jar被加载的呢?
咱们从自定义的类加载器:sun.misc.Launcher$AppClassLoader。根据包名插在Launcher类所在的位置:
咱们是在rt.jar中的sun\misc包下找到的。
说明:launcher是一个Java虚拟机的入口应用
三:扩展类加载器
扩展类加载器时什么?怎么用?
根据名字,咱们就能够知道,该加载器是为了扩展Java功能的,不被淘汰的。在Java的API中,咱们会看到不少,javax.xxx的。这些javax包下的类就是扩展类加载器管理的。
对应jre中的ext文件夹下:
下面代码执行后的结果是什么?
private static void showMyObjectClassLoaderLeve() {
MyObject myObject = new MyObject();
System.out.println("MyObject 的爷爷:"+myObject.getClass().getClassLoader().getParent().getParent());
System.out.println("MyObject 的爸爸:"+myObject.getClass().getClassLoader().getParent());
System.out.println("MyObject 本身的:"+myObject.getClass().getClassLoader());
}
从运行结果中咱们能够看到:
自定义类的类加载器是:AppClassLoader
其父加载器:ExtclassLoader
其父加载器的父加载器:null
从这个层级关系中,咱们就能够知道,原来咱们本身写的类是在扩展类加载器下。
思考:
若是是object.getclass().getClassLoader().getParent()会输出什么?
答案是:会抛出空指针异常。为何呢?由于Object是jvm自带的。没有父加载器了。
五:用户自定义的类加载器
须要继承Java.lang.ClassLoader这个类,而后在自定义处理。
咱们生活在地球上,其中空气、水、阳光这些是咱们必须且赖以生存的基本条件,这三个就至关因而JVM的启动类加载器(BootStap加载器);
为了能安全的生存下去,抵挡天然界或是外界威胁,咱们组成了团体,最后组成国家,有了国家的军队保护着就安全了。这就至关因而扩展类加载器(Externsion Class Loader)
要想成为中国人,拥有中国国籍的话,须要至少父母一方是中国人(其余特殊状况不考虑),这个就至关因而应用程序类加载器(AppClassLoader)了;
若是想要生活的更好,本身就要努力,就要有个好工做,有一套属于本身的房子。这个就至关因而用户自定义的类加载器了。
简图以下:
接下来学习:Java的双亲委派机制及沙箱安全机制是什么?如何理解jvm的双亲委派机制?用代码如何验证?欢迎你们和凯哥Java(WXID:kaigejava)一块儿继续学习