`

《深入理解Java虚拟机》笔记之第7章 虚拟机类加载机制

阅读更多

1、类的生命周期

     

 

2、虚拟机规范严格控制规定了有且只有四种情况必须立即对类进行“初始化”(而加载、验证、准备自然需要在这些之前开始)。

   1)使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法的时候。更严格的说,是遇到newgetstaticputstaticinvokestatic4条字节码指令时,如果类没有进行初始化,则需要先触发其初始化;

   2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化;

   3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化;

   4)当虚拟机启动时,用户需要指定一个要执行的主类(包括main方法的那个类),虚拟机会先初始化这个主类。

    注意,接口的情况并不适合第三种情况。即一个接口在初始化时,并不要求其父接口全部都完成初始化了,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。

 

3、加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,然后在Java堆中实例化一个java.lang.Class类的对象,这个对象将作为程序访问方法区中的这些类型数据的外部接口。  P177

 

4、准备阶段(P181           

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。注意,这里的类变量是指被static修饰的变量,不包括实例变量 (实例变量分配在堆中)。

类变量有两种:

    (1) public static int value = 123;那么变量value在准备阶段之后的初始值是0,因为此时尚未执行任何java方法,赋值123是在初始化阶段才执行的;

   2public static final int value = 123;那么编译时会为value生成ConstantValue属性,准备阶段就会赋值为123

    即:变量有两次赋初值的过程:一次在准备阶段,赋予系统初始值;一次在初始化阶段,赋予程序员定义的初始值。

 

5、初始化:

   <clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,收集的顺序由语句在源文件中出现的顺序决定的。静态语句块中只能访问到定义在静态语句块之前的变量,定义在其后的变量可以赋值,但不能访问。

   <clinit>()方法无须显示地调用父类构造器,虚拟机会保证父类的方法在子类的方法前面执行。因此第一个被执行的<clinit>()方法的类是Object。因此,父类中定义的静态语句块会优先于子类的变量赋值操作。

执行接口的<clinit>()方法不需要先执行父接口的<clinit>()方法,接口的实现类也不会先执行接口的<clinit>()方法。只有当父接口中定义的变量被使用时,父接口才会被初始化。

虚拟机会保证一个类的<clinit>()方法在多线程中被正确的加锁和同步。如果在一个类的<clinit>()方法中有耗时很少的操作,可能造成多个线程阻塞。

 

6、对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性。“相等”也只有在同一个类加载器的前提之下才有意义。(这里的“相等”包括代表Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果)。

 

7、类加载的双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是指把这个请求委派给父类加载器去加载,直到最顶层的Bootstrap ClassLoader

该模型解决了:各个加载器的基础类的统一问题(越基础的类由越上层的加载器进行加载)。如类java.lang.Object,无论哪一个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,所以在程序的各种类加载器环境中都是同一个类。

为了解决使用Bootstrap ClassLoader的类需要调用用户的代码(如JNDIJDBCJCESPI)的问题,Java设计团队引入了线程上下文类加载器(Thread Context ClassLoader)。如果创建线程时还未设置,那么会从父线程中继承;如果应用程序的全局范围内都没有设置过,这个类加载器默认就是应用程序类加载器。

 

注意:类加载的双亲委派模板并不是一个强制性的约束。

  • 大小: 15.2 KB
分享到:
评论

相关推荐

    深入理解Java虚拟机读书笔记之:第3章 安全(3)

    《深入理解Java虚拟机》是Java开发者必读的经典之作,其中第三章主要探讨了Java安全方面的内容。在Java中,安全是一个至关重要的概念,因为Java的设计目标之一就是提供一种可以在不同环境中安全运行的代码机制。本章...

    深入java虚拟机笔记

    综上所述,《深入Java虚拟机》这本书覆盖了Java体系结构、平台无关性、安全性、网络移动性以及JVM内部运作等多方面的内容,对于想要深入了解Java虚拟机及其工作机制的读者来说是非常有价值的参考资料。

    JVM:深入理解Java虚拟机 - 学习笔记

    《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...

    Java虚拟机讲解笔记.docx

    Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作系统之上,硬件之下,提供了一层软件抽象,使得Java程序可以在多种平台上运行而无需重新编译。JVM的核心功能包括内存管理、垃圾收集、安全性和平台独立性。...

    java虚拟机源码学习-UnderstandingTheJVM:深入理解Java虚拟机(周志明)源码及学习笔记

    《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...

    大佬的java笔记

    作为笔记的作者,被称为“专业第一”,意味着笔记内容会覆盖Java的基础语法、面向对象的深入理解和高级特性。 2. 面向对象编程:在Java中,一切皆为对象,这是Java最重要的编程范式之一。面向对象编程的基本概念...

    毕向东Java笔记

    ### 毕向东Java笔记知识点总结 #### 第一章:编程基础 1. **Java的特性和优势**: - **简单性**:Java的设计哲学是“使编程变得简单”。 - **面向对象**:Java完全支持面向对象编程概念如封装、继承和多态。 - ...

    逐步深入的java学习笔记

    - **垃圾回收**: 由Java虚拟机(JVM)中的一个后台线程GC负责。 - 当虚拟机检测到内存不足时,会触发垃圾回收过程。 - 用户可以通过调用`java.lang.System.gc()`来建议进行垃圾回收,但系统可能会忽略这个请求,根据...

    Java_se基础毕向东老师全程笔记

    ### 第七章:集合框架(容器) - **集合接口**:`Collection`、`Map`。 - **实现类**:`ArrayList`、`HashMap`等。 - **迭代器**:使用`Iterator`或增强型for循环遍历集合。 ### 第八章:IO流 - **输入输出流**:`...

    Java随堂笔记

    - **性能优化**:JVM参数调整,类加载机制。 9. **Java标准库** - **IO与NIO**:传统IO与非阻塞IO的区别和应用场景。 - **反射机制**:运行时动态获取类信息和调用方法。 - **注解(Annotation)**:自定义注解...

    Corejava 核心java笔记

    10. **JVM与性能优化**: 了解Java虚拟机的工作原理,如类加载机制、内存模型、垃圾回收策略,有助于进行程序性能调优。 这些知识点构成了Java编程的基础,通过阅读和整理"Corejava 核心java笔记",初学者可以系统地...

    java 学习笔记大全

    九、Java虚拟机(JVM) 15. JVM工作原理:了解类加载、内存管理和垃圾回收。 十、Java EE 16. Servlet与JSP:用于构建动态Web应用的技术。 17. JDBC:与数据库交互的API,用于执行SQL语句和管理数据库连接。 十一...

    java私塾学习笔记整理

    #### 第七章:抽象类和接口 **一、抽象类** 抽象类是不能被实例化的类,通常包含抽象方法,用于提供一个类族的共同行为的模板。 **二.接口** 接口定义了一组行为规范,通过关键字`interface`声明。 1. **接口...

    java学习笔记3

    9. **JVM原理**:理解Java虚拟机的工作原理,包括类加载、内存模型、垃圾回收等,有助于优化程序性能。 10. **泛型**:泛型是Java SE 5.0引入的新特性,它允许在定义类、接口和方法时使用类型参数,增强了类型安全...

    java学习笔记(内部资料)

    Java学习笔记是深入理解并掌握Java编程语言的重要资源,尤其对于初学者和准备Java面试的开发者来说,这些内部资料提供了丰富的知识和实践经验。本篇将根据"corejava"这一核心标签,结合压缩包中的文件"java学习笔记...

    东北大学计算机考研Java知识点笔记

    12. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾回收(GC)和性能调优策略。 13. **Java集合框架中的并发容器**:如ConcurrentHashMap、CopyOnWriteArrayList...

    JAVA学习笔记绝密不外泄

    - 理解JVM的工作原理,包括类加载机制、内存模型和垃圾回收。 9. **设计模式** - 学习常见的设计模式,如单例模式、工厂模式、观察者模式等,提升代码的可维护性和扩展性。 10. **Java标准库** - 掌握Java的...

    java基础笔记

    12. **Java虚拟机(JVM)**:JVM是Java程序运行的平台,负责类的加载、验证、解析、执行以及垃圾回收。理解JVM的工作原理和内存模型对性能优化至关重要。 13. **Java EE**:对于Web开发,Java EE(Enterprise ...

    毕向东_Java基础课堂笔记.pdf

    #### 第七章 集合框架(容器) - 集合框架是Java中用于存储和操作一组对象的标准API。 - 主要包括List、Set、Map等接口及其实现类。 #### 第八章 IO流 - 输入/输出流是Java中用于处理文件和数据流的基本类。 - ...

    java jdk 学习笔记

    这包括垃圾回收机制、类加载机制、字节码执行过程等。 以上就是从给出的文件中能够提取到的关于Java JDK学习笔记的知识点。在实际的学习中,我们还需要结合实践,通过编写代码、运行程序、调试和解决实际问题来逐步...

Global site tag (gtag.js) - Google Analytics