JVM-类加载机制

本篇主要介绍一下JVM类加载的过程。类从被JVM加载到内存到从内存中卸载,其生命周期包括:加载(loading)、验证(verifying)、准备(preparing)、解析(resolving)、初始化(initialisaing)、使用(using)和卸载(unloading)7个阶段。其中加载、验证、准备、初始化、和卸载的顺序是固定的,解析有可能会在初始化之后进行。如下图所示:

1、加载:在类加载阶段主要完成以下三件事情:①通过此类的全限定名来获取此类的二进制字节流。②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。③在java堆中生成对应的java.lang.Class对象。java字节码的获取方式可以有以下几种方式:

  • (1)从ZIP包中获取(如jar、ear、war等)
  • (2)从网络中获取
  • (3)运行时动态生成,使用最多的就是动态代理(如:JDK动态代理、CGLIB动态代理)
  • (4)其他文件生成(如JSP编译生成对应的class文件)
  • (5)从数据库中读取(相对较少)

2、验证:验证的目的是保证字节码文件是正确的。验证的方式主要有以下几种:①文件格式的验证;②元数据验证;③字节码验证(很复杂);④符号引用验证

(1)文件格式的验证

  • ①是否以0XCAFEBABY开头
  • ②主次版本号是否在当前JVM处理范围之内
  • ③常量池中是否有不被支持的常量
  • ......

(2)元数据验证

  • ①是否有父类
  • ②继承了final类?
  • ③非抽象类实现了所有的抽象方法
  • ......

(3)字节码验证

  • ①运行检查
  • ②栈数据类型和操作码数据参数吻合
  • ③跳转指令指定到合理的位置
  • ......

(4)符号引用验证

  • ①符号引用中通过字符串描述的权限定名是否能找到对应的类
  • ②类中是否存在符合方法的字段描述以及简单名称所描述的方法和字段
  • ③符号引用中的类、字段、方法的访问性是否可以被当前类访问
  • ......

3、准备:准备阶段就是为static类型的变量分配初始值(如int类型的初始值为0),需要注意的是当变量类型为static final时,准备阶段就将其赋值为最终的值。

4、解析:JVM将常量池内的符号引用(与JVM无关)转化为直接引用(与JVM相关)。解析动作主要针对于类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用。

5、初始化:初始化阶段包括执行构造器<clinit>,其中包括了static变量赋值语句和static{}静态块;子类的<clinit>调用之前保证父类的<clinit>被调用;还有一点就是<clinit>是线程安全的。

时间: 2024-10-11 04:26:52

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也