JVM学习笔记之类装载器-ClassLoaderJVM体系结构概览
类装载器ClassLoader:
负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于class文件是否可以允许,则由ExecutionEngine决定。
我们来看看Java类编译成class文件后,文件开头特定的文件标识是什么样的?如下图:
类加载器
类加载器的分类:JVM自带的三个类加载器
启动类加载器:Bootstrap使用C++语言写的扩展类加载器:Extension使用Java语言写的
应用程序类加载器:AppclassLoader。Java也叫系统类加载器,加载当前引用的classPath所有类。
用户自定义加载器:
需要继承Java.lang.ClassLoader的子类。几种类加载器关系如下图:
代码演示:
一:启动类加载器--查看Object的类加载器
执行:
Objectobj=newObject();
System.out.println(\classLoader:\执行后,我们发现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:
再来看看list所在的位置:
现在知道为什么,安装jdk之后,我们就可以直接使用很多类了吧。因为这些类所在的jar再启动的时候,就被bootstap启动类加载器加载了,所以我们就可以直接使用了!!怎么证明rt.jar被加载的呢?
我们从自定义的类加载器:sun.misc.Launcher$AppClassLoader。根据包名插在Launcher类所在的位置:
我们是在rt.jar中的sun\\misc包下找到的。说明:launcher是一个Java虚拟机的入口应用三:扩展类加载器
扩展类加载器时什么?怎么用?
根据名字,我们就可以知道,该加载器是为了扩展Java功能的,不被淘汰的。在Java的API中,我们会看到很多,javax.xxx的。这些javax包下的类就是扩展类加载器管理的。
对应jre中的ext文件夹下:
四:自定义类加载器的层级关系:下面代码执行后的结果是什么?
privatestaticvoidshowMyObjectClassLoaderLeve(){MyObjectmyObject=newMyObject();
System.out.println(\的
爷:\
爷