1.虚拟机类加载机制

疯狂的肉包 疯狂的肉包     2022-08-12     284

关键词:

Java虚拟机的类加载机制

1.Java虚拟机的特点

1.1语言无关性

Java虚拟机并不进进支持java语言,可以支持JRuby,JPython,Scala等

1.2平台无关性

Java天生就是为了摆脱操作系统的束缚而产生的,提出了一个"编译一次,任意运行"的口号

总结:

  • Java系的语言通过自己的编译器把源代码编译为字节码存放在class文件中,虚拟机通过加载字节码实现,虚拟机的语言无关性
  • 字节码的功能远远比java语言强大,因为java不能提供的功能,其他的Java系语言可能可以提供,而字节码必须对所有的Java系语言提供底层的技术支持
  • Java的平台无关性是有条件的,比如JDK1.6打的Jar包在JDK1.8的虚拟机上是不能执行的(向下兼容)

 

2.类加载机制概述

2.1概述

类载虚拟机中的使用分为如下的几个步骤

1.加载 2.验证 3.准备 4.解析 5.初始化 6.使用 7.卸载

备注:

  • 解析不一定初始化之前,可能回在初始化之后,这是为了配合java的后期绑定(动态绑定)
  • java动态绑定—一般的函数、不包括被static和final修饰的函数
  • 1.前期绑定:编译器在程序执行之前就知道,调用哪个函数体
  • 2.后期绑定:编译器不知道参数(接口)调用的是哪个对象的函数

2.2 类的初始化

     类的加载时机是交给虚拟机进行把握的,但是对于类的初始化有严格的要求的,因此我们先介绍类的初始化的时机,如下的几种情况会进行虚拟机的类加载

  • 使用new创建的类的对象,使用类的静态变量和调用类的静态函数
  • 利用反射机制使用类时
  • 初始化一个类的时候,如果发现其父类还没有被初始化,应该进行父类的初始化
  • 虚拟机初始化的时候,优先初始化含有main函数的主类
  • 与java的动态语言特性相关----先不介绍

  除了上边的5种情况,其他的情况都不会引起类的初始化,我们称为被动引用  

  • 1.子类调用父类的静态变量或者静态函数不会引起子类的初始化,只会引起父类的初始化
  • 2.定义了类的对象数组,但是没有进行初始化——————————————Father[ ] arrays=new Father[10];是不会调用Father类的构造函数的
  • 3.使用类中的常量,在编译期间会把类的常量加载到方法区的常量池中,所以不会触发类的初始化

2.2.1 接口的初始化

  接口初始化时发现接口的父接口没有进行初始化时是不会进行初始化的,只有到父接口被使用的时候才会进行初始化

2.3 加载过程-----加载是类加载的一个子过程

非数组类的加载----利用类加载器(类必须和类的加载器有一一对应的关系,可以使用用户自己定义的类加载器,也可以使用系统提供的引导加载器)

  1. 根据类名获取相对应的二进制字节码------不一定从类的Class文件中获取,加载完之后会把类进行初始化的
  2. 将二进制字节码中的类的相关静态变量提取出来,放到虚拟机的方法区的运行时数据结构中
  3. 在内存中生成一个该类的Class对象,提供类的方法去中的运行时数据结构的访问入口------比较特殊不一定在堆中进行创建

数组类的加载

  • 数据是由虚拟机直接产生的,数据存放的类型(数据减一纬)是由类加载器产生的
  • 数组的类型的创建过程如下:
      • 类型是引用类型---递归调用该类型的类加载器创建数组中的元素 
      • 类型不是引用类型-使用引导加载器进行创建,eg:int[]

 

深入理解java虚拟机类加载机制

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。本系列其他文章:【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM【深入理解Java虚拟机】垃圾回收机制1、类加载机制概述虚拟机把... 查看详情

虚拟机类加载机制

虚拟机类加载机制类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和... 查看详情

6.虚拟机类加载机制

...并对数据进行校验,转换解析和初始换,最终形成可以被虚拟机直接说使用的java类型。2.java虚拟机中类加载的全过程650)this.width=650;"src="https://s1.51cto.com/wyfs02/M00/9E/24/wKiom1mL- 查看详情

深入理解java虚拟机--虚拟机类加载机制(代码片段)

文章目录1.虚拟机类加载机制说明2.类生命周期2.1类生命周期总述2.2加载2.3验证2.3.1验证的目的2.3.2验证的四个方面2.4准备2.4.1准备的目的2.5解析2.5.1解析的目的2.5.2补充概念2.6初始化2.6.1初始化阶段说明2.6.2<clinit>方法说明2.7卸... 查看详情

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

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

虚拟机类加载机制

第一步:加载1.获取二进制字节流2.字节流的静态存储结构转化为方法区的运行时数据结构3.在java堆里生成一个类对象,作为方法区的访问入口(Class对象)第二步:验证1.验证Class文件的标识:魔数MagicNumber2.验证主副版本号3.验... 查看详情

虚拟机类加载机制之类的加载过程

...:加载,验证,准备,解析,初始化。加载  加载阶段虚拟机需要完成3件事:  1)通过一个类的全限定名来获取定义此类的二进制字节流,获取方式很多种如Class文件、网络、运行时计算生成等。  2)将这个字节流代表... 查看详情

《深入理解jvm——虚拟机类加载机制》

JVM深入理解JVM(5)——虚拟机类加载机制 PostedbyCrowonAugust21,2017在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟... 查看详情

虚拟机类加载机制概述

虚拟机类加载机制概述“代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。”什么是虚拟机的类加载机制?Class文件中存储的各种关于类的描述信息,需要加载到虚拟机中才能... 查看详情

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

1.类的生命周期验证、准备、解析统称为连接。加载、验证、准备、初始化、卸载这5个阶段开始执行的顺序固定,但往往是交叉执行,并不会执行完一个再执行下一个。解析某些情况下会在初始化之后,这是为了支持Java的动态... 查看详情

虚拟机类加载机制------类加载的过程

1.加载虚拟机需要干三件事:①、通过一个类的的全限定名来获取定义此类的二进制字节流(没有规定二进制字节流从那里获取,怎样获取,许多java技术也都建立在这基础上)②将这个字节流所代表的静态存储结构转化为方法区... 查看详情

《深入理解jvm——虚拟机类加载机制》(代码片段)

JVM深入理解JVM(5)——虚拟机类加载机制 PostedbyCrowonAugust21,2017在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟... 查看详情

虚拟机类加载--1.类加载的时机

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

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

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

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

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

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

本文参考《深入理解java虚拟机》虚拟机加载类的过程:java源程序被编译器编译成class文件后,会被虚拟机的类加载器加载,加载完成后,会为class文件在内存中开辟一块空间用来存储class文件对象,之后对class文件进行校验,准... 查看详情

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

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

虚拟机类加载机制

...态链接这个特点实现的。类加载的时机  类从被夹在到虚拟机内存中开始,到卸载出内存位置,它的整个生命周期包括:加载、验证、准备、解析 查看详情