




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
。Java虚拟机1. ClassLoader(类加载器)2. Java虚拟机与程序的生命周期: 1)在如下几种情况下,java虚拟机将结束生命周期执行了System.exit()方法。 程序正常执行结束。程序在执行过程中遇到了异常或错误而异常终止。由于操作系统出现异常而导致java虚拟机进程结束。3. 类的加载,连接于初始化: 加载:查找并加载类的二进制数据。连接:验证:确保被加载类的正确性。准备:为类的静态变量分配内存,并将其初始化为默认值。解析:把类中的符号应用转变成直接引用。 初始化:为类的静态变量赋予正确的初始值。4. java程序对类的使用方式可分为两种:主动使用 1)创建类的实例。 2)访问某个类或接口的静态变量,或者对该静态变量赋值。 3)调用类的静态方法。 4)反射(如:Class.forName(com.zl.Test))。 5)初始化一个类的子类。 6)Java虚拟机启动时被标为启动类的类(Java Test)。被动使用 *除了以上6种情况,其他使用java类的方式都被看做是对类的被动使用,都不会导致类的初始化*5. 所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们。6. 类的加载:类的加载是指将类的.class文件中的二进制数据读入内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.long.Class对象,用来封装类在方法区内的数据结构。7. 加载.class文件的方式:从本地系统中直接加载。通过网络下载.class文件。从zip,jar等归档文件中加载.class文件。从专有数据库中提取.class文件。将java源文件动态编译为.class文件。8. 加载类图:9. 类的加载的最终产品是位于堆区中的Class对象。10. Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结果的接口。11. 类加载器的类型:Java虚拟机自带的加载器:根类加载器(Bootstrap):使用c+编写,程序员无法在java代码中获得该类。扩展类加载器(Extension):使用java代码实现。系统类加载器(System)【应用加载器】:使用java代码实现。用户之定义类加载器:java.long.ClassLoader的子类用户自定义加载器都是java.long.ClassLoader的子类。用户可以定义类的加载方式12. 类加载器“并不需要”等到某个类被“首次主动使用”时再加载它。JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LikeageError错误)。如果该类一直没有被程序主动使用,那么类加载器就不会报告错误。13. 类的验证:类被加载后就进入连接阶段。连接就是将已经读如到内存的类的二进制数据合并到虚拟机的运行时环境中去。类的验证的内容:1) 类文件的结构检查:确保类文件遵从Java类文件固定格式。2) 语义检查:确保类本身符号Java语言的语法规定,比如验证final类型的类没有子类,以及final类型的方法没有被覆盖。3) 字节码验证:确保字节码流可以被Java虚拟机安全地执行。 字节码流代表Java方法(包括静态方法和实例方法),它是由被称做操作码的单字节指令组成的序列,每一个操作码后都根着一个或多个操作数。字节码验证步骤会检查每个操作码是否合法,即是否有着合法的操作数。4) 二进制兼容性的验证:确保相互引用的类之间协调一致。例如在Worker类的getWork()方法中会调用Car类的run()方法。Java虚拟机会在验证Worker类时,会检查在方法区类是否存在Car()类的run()方法,假如不存在(当Worker类和Car类的版本不兼容,就会出现这种问题),就会抛出NoSuchMethodError错误。14. 类的准备在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。例如对于以下的Simple类,在准备阶段,将为int类型的静态变量a分配4个字节的内存空间,并且赋予默认值0,为long类型的静态变量b分配8个字节的内存空间,并赋予默认值0。public class Sampleprivate static int a =1;public static long b;static b=2;15. 类的解析在解析阶段,Java虚拟机会把类的二进制数据中的符号引用替换 为直接引用。例如在Worker类的gotoWork()方法中引用Car的run()方法。public void gotoWork()car.run(); /这段代码在Worker类的二进制数据中表示为符号引用。在Worker类的二进制数据中,包含了一个对Car类run()方法的符号引用,它由run()方法的全名和相关描述符组成。在解析阶段,Java虚拟机会把这个符号引用替换为一个指针,该指针指向Car类的run()方法在方法区内的内存位置,这个指针就是直接应用。16. 类的初始化在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。在程序中,静态变量的初始化有两种途径:(1):静态变量的声明处初始化;(2)在静态代码块中进行初始化,例如以下代码快中,静态变a和b都被显示初始化,而静态变量c没有被显示初始化,他将保持默认值0;public class Simpleprivate static int a = 1; /在静态变量的声明出进行初始化private static long b;private static long c;static b =2; /在静态代码块中进行初始化 静态变量的声明语句,以及静态代码块都被看着类的初始化语句,Java虚拟机会按照语句在类文件中先后顺序依次来执行他们。例如当下Simple类被初始化后,它的静态变量a的取值为4。public class Simplestatic int a =1;static a=2;statica=4;public static void main(String args)System.out.println(a=+a);类的初始化步骤(1) 假如这个类还没有被加载和连接,那就先进行加载和连接。(2) 假如这个类存在直接的父类,并且这类还没有被初始化,那就先初始化直接的父类。(3) 假如类中存在初始化语句,那就依次执行这些初始化语句。(4) 类的主动使用 1)创建类的实例。 2)访问某个类或接口的静态变量,或者对该静态变量赋值。 3)调用类的静态方法。 4)反射(如:Class.forName(com.zl.Test))。 5)初始化一个类的子类。 6)Java虚拟机启动时被标为启动类的类(Java Test)。(5) 当Java虚拟机初始化以个类时,要求它的所有父类都已经被初始化,但是这条这条规则并不适用于接口。在初始化一个类时,并不会先初始化它所实现的接口。在初始化一个接口时,并不会先初始化它的父接口。*因此,一个父接口并不会因为它的子接口或者实现类初始化而初始化,只用当程序首次使用特定接口的静态变量时,才会导致该接口的初始化*(6) 程序中对子类的“主动使用”会导致父类被初始化;但对父类的“主动”使用并不会导致子类的初始化(不可能说生成一个Obejct类的对象就导致系统中所有的子类都被初始化)。只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用。(7) 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。17. 类加载的父委托机制(Parent Delegation)类加载器用来把类加载到Java虚拟机中。从jdk1.2版本快开始,类的加载过程采用父亲委托机制,这种机制能更好地保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的跟类加载器外,其余的类加载器都有且只有一个类加载器。当Java程序请求加载器loader1加载Simple类时,loader1首先委托自己的父加载器去加载Simple类,若父加载器能加载,则有父加载器完成加载任务,否则才由加载器loaderb本身加载Simple类。Java虚拟机自带了一下几种加载器(1) 根(Bootstrap)类加载器:该类加载器没有父加载器,它负责加载Java虚拟机的核心类库,如加载java.long.*等等。例如从10-4(Simple.java)可以看出,java.long.Object就是由根类加载器来加载的,根类加载器从系统属性sun.boot.class.path所指定的目录中加载类库。跟类加载器的实现依赖底层操作系统,属于虚拟机实现的一部分,它没有继承java.lang.ClassLoader类。(2) 扩展(Extension)类加载器:它的父加载器是根类加载器。它从java.ext.dirs系统属性所指定的目录中加载类库,或从jdk的安装目录的jrelibext子目录(扩展目录)下加载类库,如果把用户创建的jar文件放在这个目录下,也会自动由扩展类加载器加载,扩展类加载器是纯Java类,是java.lang.ClassLoader的子类。(3) 系统(System)类加载器:也称为应用类加载器,它的父加载器为扩展类加载器。它从环境变量classpath或者系统属性java.class.path说指定的目录中加载类,它是用户自定义的类加载器的默认父加载器。系统加载器是纯Java类,是java.lang.ClassLoader来的子类。*父子加载器并非继承关系,也就是说子加载器不一定继承父加载器*除了以上虚拟机自带的加载器外,用户还可以定制自己的加载 器(User-defined Class Loader)。Java提供了抽象类 java.lang.ClassLoader,所有用户自定义的类加载器应该继承 ClassLoader类。18. JVM自带的类加载器之间的关系型:19.在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了跟根类加载器以外,其余的类加载器都有且只有一个父加载器。10-420. Class sampleclass = loader2.loadClass(Sample);loader2首先从自己的命名空间中查找类Sample是否已经被加载,如果已经加载,就直接返回代表Sample类的Class对象的引用。如果Sample类还没有被加载,loader2首先请求loader1代为加载,loader1再请求系统类加载器代为加载,系统类加载器再请求扩展类加载器代为加载,扩展类加载器再请求根类加载器代为加载。若根类加载器和扩展类加载器都不能加载,则系统类加载器尝试加载,若能加载成功,则将Sample类所对应的Class对象的引用返回给loader1,loader再将引用返回给loader2,从而成功将Sample类加载进虚拟机。若系统类加载器不能加载Sample类,则loader1尝试加载Sample类,若loader1也不能成功加载,则loader2尝试加载。若所有的父加载器及loader2本身都不能加载,则抛出ClassNotFoundException异常。若有一个类加载器能成功加载Sample类,那么这个加载器被称为定义类加载器,所有能成功返回Class对象的引用的类加载器(包括类定义加载器)都被称为初始类加载器。定义类加载器及其所有所有子加载器都称作:初始类加载器。假设loader1实际加载了Sample类,则loader1为Sample类的定义类加载器,loader2和loader1为Sample类的初始加载器。21. 需要指出的是:加载器之间的父子关系实际上指的是加载器对象之间的包装关系,而不是类之间的继承关系。一对父子加载器可能是同一个加载器类的实例,也可能不是。在子加载器对象中包装了一个父加载器对象。例如:loader1和loader2都是MyClassLoader的实例,并且loader2包装了loader1,loader1是loade2的父加载器。ClassLoader loader1 = new MyClassLoader();/参数loader1将作为loader2的父加载器ClassLoader loader2 = new MyClassLoader(loader1);22. 当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器就将成为该类加载器的父加载器。23. 父亲委托机制的有点是能够提高软件系统的安全性。因为在此机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类,从而防止不可靠甚至恶意的代码代替由父加载器加载的可靠代码。例如:java.lang.Object类总是由根类加载器加载,其它任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类。24. 命名空间:每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。在同一命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类;在不同命名空间中,有可能出现类的完整名字(包括类的包名)相同的两个类。25. 运行时包:由同一个类加载器加载的属于相同包的类组成了运行时包。决定两个类是不是属于同一个运行时包,不仅要看他们的包名是否相同,还要看定义类加载器是否相同。只有属于同一运行时包的类才能相互相访问包可见(既默认访问级别)的类和类成员。这样的限制能避免用户自定义的类冒充核心类库的类,去访问核心类库的包可见成员。假设用户自定义了一个类java.lang.Spy,并由用户之定义的来加载器加载,由于java.lang.Spy和核心类库java.lang.*由不同的加载器加载,它们属于不同的运行时包,所以java.lang.Spy不能访问核心类库java.lang包中的包可见成员。26. 创建用户自定义的类加载器:要创建用户自己的类加载器,只要扩展java,lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用。27. 自定义类加载器结构图:当执行loader2.loadClass(Sample)时,先由它上层的所有父加载器尝试加载Sample类。loader1先从D:myappserverlib目录下成功加载了Sample类,因此loader1是Sample类的定义类加载器,loader1和loader2是Sample类的初始类加载器。当执行loader3.loadClass(Sample)时,先由它上层的所有父加载器尝试加载Sample类。loader3的父加载器为根类加载器,它无法加载Sample类,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能科技领域职业技能培训合作方案
- 2025年中小微企业供应链金融创新案例对比分析报告
- 公估行业监管政策-洞察及研究
- 广西中医药大学《粮油加工工艺学实验》2023-2024学年第一学期期末试卷
- 南华大学《海洋生物动力学》2023-2024学年第一学期期末试卷
- 语音交互优化-第1篇-洞察及研究
- 五邑大学《外教口语》2023-2024学年第一学期期末试卷
- 枣庄科技职业学院《动画表演》2023-2024学年第一学期期末试卷
- 云南能源职业技术学院《多声部音乐分析与习作3》2023-2024学年第一学期期末试卷
- 家风教育实践活动方案
- 2025春季学期国开电大本科《管理英语3》一平台机考真题及答案(第十套)
- 湖南省2025年高考公安院校公安专业考生档案审核表
- 2025年第十届“学宪法、讲宪法”网络知识竞赛题库(含答案)
- 2025年四川省宜宾五粮液集团进出口有限公司招聘笔试参考题库附带答案详解
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 宝兴县中药材生产现状及发展思路
- 台州市幼儿园教师考核表.
- 小儿雾化吸入课件.ppt
- TM92成品鞋弯折测试
- 锁骨骨折幻灯片
- 高填方、深挖路堑边坡和软基监测方案
评论
0/150
提交评论