JVM类加载机制一

类加载的过程

什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验、准备、解析并初始化,这个过程就是类加载机制。类加载分为三个阶段:加载,连接,初始化。

这三个阶段都是在程序运行期间完成的。其中加载,校验,准备,初始化,卸载的顺序都是确定的,解析可能会在初始化之后完成。
JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式。另外一种是符号引用在第一次使用的时候被解析,这种解析方式称为惰性方式。

1、加载

将字节码文件加载到内存中,并将这些静态数据转换成方法去中的运行书数据区,在堆中生成一个这个类的class对象,作为方法区数据的访问入口,这个过程需要类加载器的参与。

加载的过程:
(1)通过一个类的全限定名(包名和类名)来获取此类的二进制字节流Class文件。获取的方式可以通过jar包,war包,网络中获取,Jsp生成等方式。
(2)将字节码中的静态存储结构转换为方法区中的运行时数据结构。例如将class文件常量池转换为运行时常量池
(3)在内存中生成这个类的java.lang.Class对象,作为方法区中的各种数据的访问入口。
加载完成之后,虚拟机外部的二进制字节流按照虚拟机的格式存储在方法区中。

2、连接

连接阶段负责将类中的二进制数据合并到JRE中,类的连接大致分为三个阶段:

验证:确保Class文件字节流中包含的信息符合虚拟机的要求。验证分为四个阶段的校验操作:

(1)文件格式验证:验证字节流是否符合Class文件格式的规范。
(2)元数据验证:对字节码描述的信息进行语义分析,来保证其描述的信息符合Java语言规范的要求。
(3)字节码验证:通过数据流和控制流分析确定程序语义是合法的。这个阶段对类的方法进行校验分析,保证被校验类不会做出危害虚拟机的行为。
(4)符号引用验证:虚拟机将符号引用转换为直接引用,这个动作发生在解析阶段中。主要的验证的操作:
a.符号引用中通过字符串描述的全限定名是否能找到对应的类。
b.载指定泪痕总共是否存在符合方法字段描述符以及简单名称描述的方法字段。
c.符号引用中的类,字段,方法的访问修饰符是否可以被当前类访问。

准备

准备阶段为类的静态变量在方法区中分配内存并赋默认值(0或者null)。
对于一般的成员变量在实例化时,随着对象一起在堆中分配内存。
对于静态常量在准备阶段赋自己设定的值,而静态变量是在初始化阶段完成的。

解析

解析阶段是虚拟机将虚拟引用转换为直接引用的过程。
符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任意形式的字面量,只要使用时能无歧义的定位到目标即可。引用的目标不一定已经到加载内存中,与内存布局无关。
直接引用:直接可以指向目标的指针,相对偏移量或者是一个能间接定位到目标的句柄。直接引用与内存布局相关。
主要分为:类或者接口的解析、字段的解析、类方法的解析、接口方法的解析,方法句柄,方法类型的解析。

3、类的初始化

类的初始化过程是执行类构造器方法的过程。
a、方法是由所有类变量的赋值操作和静态语句块组成的。

static int i=1;
static{

}

b、方法对于类或者接口不是必需的,如果一个类没有静态变量或者静态语句块那么编译期可以部位这个类生成方法
c、父类的先于子类的方法执行,所以父类中定义的静态代码块要先于子类的静态代码块执行。所以可以得出以下执行顺序:
顺序:初始化父类的静态代码->初始化子类的静态代码->初始化父类非静态代码->初始化父类的构造函数->初始化子类的非静态代码->初始化子类的构造函数
注意:类构造器的与构造函数的不同。

类加载的时机

类的主动引用(一定会发生类的初始化
1、new一个类的对象
2、调用类的静态成员(除了final常量)和静态方法
3、使用java.lang.reflect包的方法对类进行反射调用
4、当虚拟机启动先启动main方法所在的主类
5、当初始化一个类,如果其父类没有被初始化,则先初始化它父类;接口不同的是不要求所有的父接口都初始化
类的被动引用(不会发生类的初始化)
6、当访问一个静态域时,只有真正声名这个域的类才会被初始化
7、通过子类引用父类的静态变量,不会导致子类初始化
8、通过数组定义类的引用,不会触发此类初始化
9、引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中

参考:《深入理解JVM虚拟机》

原文地址:https://www.cnblogs.com/ozho/p/10598695.html

时间: 2024-10-10 22:41:25

JVM类加载机制一的相关文章

JVM 类加载机制详解

原文出处: ziwenxie 如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证

JVM类加载机制(转)

原文出自:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被"首次主动使用

JVM类加载机制概述:加载时机与加载过程

摘要: 我们知道,一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述了类的各种信息,并且它们最终都需要被加载到虚拟机中才能被运行和使用.事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制.本文概述了JVM加载类的时机和生命周期,并结合典型案例重点介绍了类的初始化过程,揭开了JVM类加载机制的神秘面纱. 版权声明: 本文原创作者:书呆子Rico 作者

JVM类加载机制详解(二)类加载器与双亲委派模型

在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可以通过jar包.war包.网络中获取.JSP文件生成等方式. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.这里只是转化了数据结构,并未合并数据.(方法区就是用来存放已被加载的类信息,常量,静态变量,编译后的代码的运行时内存区域) 3.在内存中生成一个代表这个类的java.lan

深入理解JVM虚拟机6:深入理解JVM类加载机制

深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体来看类加载的过程: 类的生命周期 类从被加载到内存中开始,到卸载出内存,经历了加载.连接.初始化.使用四个阶段,其中连接又包含了验证.准备.解析三个步骤.这些步骤总体上是按照图中顺序进行的,但是Java语言本身支持运行时绑定,所以解析阶段也可以是在初始化之后进行的.以上顺序都只是说开始的顺序,实际过

[JVM] JVM类加载机制总结

一  什么是类的加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类的加载指的是将类从“.java”代码文件编译成的“.class”字节码文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区(HotSpot虚拟机在方法区中)创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象

好程序员Java学习路线分享JVM类加载机制

好程序员Java学习路线分享JVM类加载机制,JVM相关概念 jdk<br>jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合. jre<br>jre(Java Runtime Evironment)Java运行时环境,是运行Java程序的平台,所有的Java程序必须在这个平台中才能执行. jvm<br>jvm(Java Virtual Machine)Java虚拟机,是用代码虚拟出来的计算机,模拟执行

一夜搞懂 | JVM 类加载机制

前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习类加载机制? 今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创新点,曾经也是Java流行的重要原因之一. Oracle当初引入这个机制是为了满足Java Applet开发的需求,JVM咬咬牙引入了Java类加载机制,后来的基于Jvm的动态部署,插件化开发包括大家热议的热修复,总之很多后来的技术都源于在JVM中引入了类加载器. 如今,类加载机制也在各个领域大放异

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值? 5.类加载器是什么? 6.如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数

七、JVM类加载机制

根据<深入理解java虚拟机>这本书总结 当我们写完代码,编辑成class文件,然后启动运行的时候,虚拟机会将class文件加载到内存(并不一定是本地的class文件,也可以从网络获取或者通过别的方式),并且经过对class文件中的数据进行校验.解析.初始化等过程,将class文件转化为虚拟机可以直接使用的java类型,整个这个过程可以叫做-类加载机制. 类加载的整个过程分为以下几部分: 1加载-2校验-3准备-4解析-5初始化-6使用-7卸载 个人觉得12345,五个部分就够了,其中234也