JVM类加载续

上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证、准备、解析、初始化。需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉。

验证:就是要对加载的二进制流文件进行各种检查,很好理解。

准备:为类变量(static)分配内存并设置初始值,即所谓的"零值",但是不包括常量(final)。

解析:将常量池的符号引用替换成直接引用,这个阶段发生时间没有明确规定,但是有具体限制:在符号引用被使用之前,必须被解析。

上述3个阶段合称连接阶段。

初始化:这里是类型初始化,不是对象初始化。

对于第一个阶段--加载,没有明确规定时机,但是初始化阶段有且仅有明确的的4种情况:

1、访问类型的静态成员(final常量除外)和使用new关键字

2、反射调用

3、一个类型的父类型先初始化

4、包含main方法的主类

初始化的过程:编译器自动按顺序收集类变量赋值语句和静态语句块(static{})生成<clinit>()方法,如果一个类型没有类变量赋值以及静态语句块,就不会自动生成。JVM需要保证调用子类的<clinit>()方法前先调用父类的<clinit>()方法(接口不必),同时保证线程安全。

最后,说一个特例,数组类。数组类由JVM自动生成,自动创建。假设自定义类com.fbi.A,A[] arrs = new A[10];语句,JVM会生成"[Lcom.fbi.A"这样的一个类型。这不是重点,真正的重点是这条语句只会去加载类A,但不会初始化类A。

时间: 2024-10-21 12:07:59

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类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段.在这五个阶段中,加载.验证.准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通

JVM类加载以及执行的实战

前几篇文章主要是去理解JVM类加载的原理和应用,这一回讲一个可以自己动手的例子,希望能从头到尾的理解类加载以及执行的整个过程. 这个例子是从周志明的著作<深入理解Java虚拟机>第9章里抄来的.原作者因为有丰富的经验,可以站在一个很高的高度去描述整个过程.而我只能以现有的水平,简单的理解这个例子. 如果读者感觉不错,那都是原作者的智慧:如果觉得不过尔尔,那就是我水平有限. 先说说日志.原先,我特别不喜欢在自己的程序里输出日志.写的时候那叫一个爽,可是一旦运行出错,那就麻烦了.因为不知道具体执行

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

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

十四.jvm类加载器

什么是类的加载? 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 1.加载.class文件的方式 从本地系统中直接加载 通过网络下载.class文件 从zip,jar等归档文件中加载.class文件 从专有数据库中提

Jvm类加载的过程

目录 Jvm类加载的过程 类加载的时机 类加载过程 类加载器 Jvm类加载的过程 类加载的时机 类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用和卸载 ; 规定5种情况: 遇到new,getstatic,putstatic或invokestatic这四条字节码指令时,如果类没有进行过初始化,则需要先触发初始化 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化, 当初始化一个类的时

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

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