jvm:虚拟机类加载机制

感遇 感遇     2022-08-28     127

关键词:

  • Java语言,类型的加载、连接、初始化都是在程序运行期间完成的
  • 类的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)
  • 连接(Linking):验证、准备、解析
  • 加载、验证、准备、初始化、卸载这5个阶段的顺序是确定的
  • 有且仅有5种情况必须对类进行“初始化”
    1. 遇到new、getStatic、putStatic、ivokeStatic
    2. 对类进行反射调用
    3. 初始化一个类,如果其父类还没初始化
    4. 虚拟机启动时,执行的主类(包含main)
    5. 当使用1.7的动态语言支持,如果一个java.lang.invoke.MethodHandle实例的最后解析结果有REF_getStatic、REF_putStatic、REF_ivokeStatic,其所对应类也要初始化

    除此之外,所有引用类的方式都不会被初始化,成为被动引用

  • 被动引用的例子
    1. 通过子类调用父类的静态字段。子类不会被初始化
    2. 通过数组定义来引用类,不会触发此类的初始化
    3. 常量在编译阶段会存入调用类的常量池中(常量传播化),本质上并没有直接引用定义常量的类,因此不会触发定义常量的类的初始化
  • 类的加载过程
    1. 通过一个类的全限定名来获取定义此类的二进制字节流(jar、Applet、Proxy、JSP等)
    2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    3. 在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
  • 验证:文件格式验证、元数据验证、字节码验证、符号引用验证
  • 准备:是正式为类变量分配内存并设置类变量初始值的阶段
  • 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
  • 初始化:<clinit>()方法,非必需
    1. <clinit>()是由编译器自动收集所有类变量的赋值操作和静态语句块合并产生的
    2. 在构造函数之前执行完毕,父类的<clinit>()先执行
    3. 执行接口的<clinit>()不需要先执行父接口的<clinit>()
    4. 只有一个线程去执行这个类的<clinit>()
  • 双亲委派模型
    1. 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,只有父加载器无法完成加载,子加载器才尝试自己去加载
    2. 启动类加载器 <- 扩展类加载器 <- 应用程序加载器 <- 自定义加载器

jvm:虚拟机类加载机制

Java语言,类型的加载、连接、初始化都是在程序运行期间完成的类的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)连接(Linking):验证、准备、解析加载... 查看详情

jvm笔记5--虚拟机类加载机制

前言:虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,及为虚拟机类加载机制。在Java语言中,类型的加载,连接和初始化过程都是在程序运行... 查看详情

jvm学习笔记——虚拟机类加载机制

概述虚拟机把描述符的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类的生命周期类从被加载到虚拟机内存中开始࿰... 查看详情

深入理解jvm读书笔记三:虚拟机类加载机制

Java虚拟机类加载机制是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程。7.1概述与那些在编译时需要进行链接工作的语言不同,在Java语言里面,... 查看详情

jvm(52),虚拟机类加载机制----类加载的过程----加载

...读者没有混淆这两个看起来很相似的名词。在加载阶段,虚拟机需要完成以下3件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生... 查看详情

jvm(51),虚拟机类加载机制----类加载的时机(代码片段)

在了解下面的举的例子之前我们先来了解一下类的加载顺序?1publicclasstest12publicstaticvoidmain(String[]args)3Cc=newC();4567classA8inta=0;9Methodm=newMethod(a);10staticinta1=10;11static12System.out.println("A:执行静态代码块A"+a1);1 查看详情

jvm(55),虚拟机类加载机制----类加载的过程----解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,符号引用在前一章讲解Class文件格式的时候已经出现过多次,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现,那解析阶... 查看详情

深入了解jvm——虚拟机类加载机制

本文为《深入理解Java虚拟机》第七章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。本作品采用知识共享署名-非商业性使用-相同方... 查看详情

jvm(53),虚拟机类加载机制----类加载的过程----验证

...目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 Java语言本身是相对安全的语言(依然是相对于C/C++来说),使用纯粹的Java代码无法做到诸如访问数组边界以外的数据、... 查看详情

jvm(54),虚拟机类加载机制----类加载的过程----准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这个阶段中有两个容易产生混淆的概念需要强调一下,首先,这时候进行内存分配的仅包括类变量(被static修饰... 查看详情

虚拟机类加载机制——类加载时机

...,所以此篇类加载机制的讲解主要来自于《深入理解Java虚拟机——JVM高级特性与最佳实践》的第7章虚拟机类加载机制。在前面《初识Java反射》中我们在开头提到要了解Java反射,就得要了解虚拟机的类加载机制。在这里,... 查看详情

jvm(56),虚拟机类加载机制----类加载的过程----初始化

...程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码(或者说是字节码)。 在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段... 查看详情

深入理解jvm学习笔记——-7虚拟机类加载机制★

你只管努力,——剩下的交给时光。在Java语言中,类型的加载、连接和初始化都是在程序运行期间完成的。我们写的java文件是不能直接运行的,可以在IDE中右键文件名点击运行,这中间其实掺杂了一系列的复杂... 查看详情

java虚拟机之虚拟机类加载机制

此处主要需要知道什么是java虚拟机?java虚拟机如何进行类加载的?java语言本身是编译型和解释型的语言,先对本地的java文件进行编译,编译后会在本地生成一个class文件,而这个生成的class文件就是java虚拟机需要加载的类所谓... 查看详情

虚拟机类加载机制(代码片段)

在介绍jvm的类加载机制之前补充一些知识。java虚拟机是一个通用的、机器无关的执行平台,是为了实现程序的”无关性“而设计的,这里的无关性包括平台无关性+语言无关性。各种不同平台的虚拟机都使用统一的程序存... 查看详情

虚拟机类加载机制(代码片段)

摘自《深入理解Java虚拟机:JVM高级特性与最佳实践》(第二版)       虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型ÿ... 查看详情

jvm学习002虚拟机类加载过程以及主动引用和被动引用

      虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。   类从被加载到虚拟机内存中开始... 查看详情

深入了解jvm——虚拟机类加载机制

本文为《深入理解Java虚拟机》第七章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。本作品采用知识共享署名-非商业性使用-相同方... 查看详情