JVM加载机制

JVM加载机制

ID:40748661

大小:40.26 KB

页数:4页

时间:2019-08-07

JVM加载机制_第1页
JVM加载机制_第2页
JVM加载机制_第3页
JVM加载机制_第4页
资源描述:

《JVM加载机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java中,在调用类的静态成员,或新建该类的对象等之前,类一定要先装入Java虚拟机中,这是勿庸置疑的。但虚拟机怎样把类装载进来的呢?要经过三步:装载(Load),链接(Link),初始化(Initializ)。其中链接又可分为校验(Verify),准备(Prepare),解析(Resolve)三步。一、装载(Load)ClassLoader就是用来装载的。通过指定的className,找到二进制码,生成Class实例,放到JVM中。ClassLoader从顶向下分为 BootstrapClassLoader、ExtensionClassLoader、SystemCl

2、assLoader以及User-DefinedClassLoader(分叉,可以多个)。如下图。这是Tomcat装载器的例子:装载过程从源码清析可见:protectedsynchronizedClassloadClass(Stringname,booleanresolve)    throwsClassNotFoundException{    //先检查是否已被当前ClassLoader装载。    Classc=findLoadedClass(name);    if(c==null){        try{        if(parent!=null)

3、{            //如果没被当前装载,则递归的到父中装载。            c=parent.loadClass(name,false);        }else{           //装载器树已到顶,还没找到的话就到Bootstrap装载器中找。注意:虽然Bootstrap是所有加载器的根,但它是C++实现的,不可能放到子的"parent"中,因此,第二层装载器是所有的根了。            c=findBootstrapClass0(name);        }        }catch(ClassNotFoundException

4、e){            //如果祖先都无法装载,则用当前的装载。子类可在findClass方法中调用defineClass,把从自定义位置获得的字节码转换成Class。            c=findClass(name);        }    }    if(resolve){        //Linksthespecifiedclass.        resolveClass(c);  //注    }    returnc;}注:1.resolveClass(c)方法的注释是链接类,而不只是解析,从该即可看出。调用resolveClass时语义

5、上是去链接,是否真的链接了我不是很清楚,但可以肯定的是没有初始化。当A类中有staticBb=newB()时,最晚会在初始化时去装载B。如果改成staticBb=null,那么把B.class删掉后,即使A已经链接,初始化过了,但也不会报错,也就是A所引用的B类没有被加载过。解析时难道没有真的去装入它所引用的B类?还是链接时,没有执行解析的步骤?问题的关键就是1.对“解析”的理解,解析时是否会去装载B类?2.JVM在链接时是否执行了解析?(毕竟有资料说,解析是可选步骤)二、链接链接就是把load进来的class合并到JVM的运行时状态中。链接 是三个阶段中最复杂的一个

6、。可以把它分成三个主要阶段:·校验。 对二进制字节码的格式进行校验,以确保格式正确、行为正确。·准备。 准备类中定义的字段、方法和实现接口所必需的数据结构。比如会为类中的静态变量赋默认值(int等:0,reference:null,char:'u0000')。·解析。 装入类所引用的其他所有类。可以用许多方式引用类:·超类·接口·字段·方法签名·方法中使用的本地变量三、初始化Initializationofaclassconsistsofexecutingitsstaticinitializersandtheinitializersforstatic fields(

7、classvariables)declaredintheclass.Initializationofaninterfaceconsistsofexecutingtheinitializersforfields(constants)declaredthere.类的初始化包括:执行静态区块和静态方法的初始化。比如下面这两种代码都会被执行,包括newB()。static{  ...}staticBb=newB();接口中不允许有staticinitializer(也就是static{...}),所以对于接口,只会执行静态字段的初始化。初始化前,装载,链接一

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。