这里简单记录一下JVM 的一些知识,参考来源于《深入理解JVM》 的书,具体的例子部分做了实验,但是不保证所有理论正确,仅仅做一个参考。
以下所有说明,均来自于JDK 1.6 版本,特殊情况会特殊说明。
先说明一下类的生命周期:加载->验证->准备->解析(可以再次验证)->初始化->使用-回收
一、 加载
1.类加载第一步是先加载,在加载阶段有3件事情。
a.通过全先限定名获取此类的二进制字节流
b.将字节流锁代表的静态存储结构转化为方法区的运行时数据
c.在内存中生成一个代表类的java.lang.Class,作为这个类里面内容的访问入口
二、验证
1.这一步的作用是确保class 文件的字节流信息符合当前虚拟机的要求,不会危害JVM本身。
我们知道JAVA 有跨平台的特性,这里的特性实际是指JVM的跨平台,也就是说其他地方加载的class 可以到另一个个环境进行使用。但是加载java类,产生class 文件不一定是JDK 的JVM,因此可以产生多种class 文件,如果有些class 文件字节流不正确,或者有害,那么会导致系统崩溃,所以需要JVM进行验证,同时也会对其中规范进行验证。(参考《Java虚拟机规范》)
2.验证手段主要包括:
a.文件格式验证:比如一些版本号,不支持的类型 等等
b.元数据验证:比如是否实现接口方法,重载方法不对,对JAVA规范的元数据信息验证。
c.字节码验证:方法体验证,栈区各个指向和指令都正确等
d.符号引用验证:比如是否通过限定名能找到该类,是否非法访问了privete 属性等一些限定内容以及一些不存在的方法等。这里有常见的IllegalAccess ,NoSuchFiled,NoSuchMethod等异常。
三、准备阶段
1.这个阶段主要为类变量分配内存和设置初始值。这里强调是类变量,不包括实例变量,实例变量将会在对象实例化时,一起分配在Java堆中,这里的初始值是数据类型的默认值。比如:public static int value = 123; 准备阶段仅仅为value 赋值为0,而不是123,在初始化阶段才会执行putstatic
指令,进行赋值。如果是constant 属性的,在准备阶段就会赋值,比如public static final int value = 123;
四、解析
1.这阶段是虚拟机将常量池的符号医用替换为直接引用的过程。
2.解析内容包括:
a.类或接口:将与改接口或者类有关系的类之间,将符号转换为直接引用。
b.字段解析:对所属类或者接口的字段的符号引用进行解析,并返回引用
c.类方法解析:类方法进行递归查找,是否名称描述都正确, 找到了就返回引用,否则会提示找不到方法
d.接口方法:和类方法解析差不多,只是规则上是满足接口的规则
五、初始化
1.类初始化是加载过程的最后一步,这里主要开始执行Java执行类中定义的程序代码(或者说是字节码).
2.初始化是执行类构造器<clinit>()方法的过程,至于具体过程,这里不详细解释,这里会先对静态变量,以及静态语句块中的变量赋值。在接口中没静态块,但是也可以有赋值操作,都会先执行父类的<clinit>操作。
3.多线程的情况下只会有一个线程会执行<clinit> 方法,其他线程阻塞等待。
小结:
1.这里仅仅初步了解我们JAVA 的前期的一些流程,为我们以后理解或者做更深入的研究做一些准备
2.
相关推荐
JVM类加载过程 JVM(Java Virtual Machine)是Java语言的核心组件之一,它是Java语言的可移植性和跨平台性的基础。JVM主要组成部分包括类加载子系统、执行引擎、本地方法接口和运行时数据区。 类加载子系统是JVM的...
**案例背景**:本案例通过编写一个简单的Java程序,使用单例模式初始化静态变量和对象,来演示类的加载过程以及类加载器的委托机制。 **案例源码**: ```java public class Singleton { private static Singleton...
类加载过程中可能会遇到一些问题,如类冲突、类循环依赖等。类冲突通常发生在不同加载器加载了相同包名下的类,导致版本不一致。类循环依赖则可能引发无限递归,使得类加载失败。解决这些问题通常需要对类加载器的...
类的加载过程包括三个主要步骤:加载、连接和初始化。 1. 加载:读取.class文件并生成对应的Class对象。这个过程可能涉及文件查找、解压等操作。 2. 链接:分为验证、准备和解析三个阶段。 - 验证:确保被加载的...
总结,Java 类加载器是JVM中的重要组成部分,它决定了类的加载过程和加载源,双亲委派机制保证了类加载的有序性和安全性。理解类加载器的工作原理有助于我们更好地进行程序设计和优化,特别是在开发插件系统、模块化...
java JVM 类加载-初始化 过程
加载过程中,字节码被转换为内存中的数据结构,并在方法区(在JVM规范的早期版本中称为永久代,现代JVM中称为元空间)中存储。同时,会在堆中创建一个`java.lang.Class`对象,作为方法区数据的封装。 2. 连接(Link...
双亲委派模型的工作流程是:从顶层的Bootstrap ClassLoader开始,逐级向下尝试加载类,直到找到能加载的类为止。 通过深入JDK源码,我们可以更清晰地理解类加载机制的细节,从而在遇到问题时能迅速定位并解决。对于...
被动使用则是在JVM运行过程中,由于JVM或JDK内部需要而进行的加载,如JNI查找类、JDK工具类的使用等。 在Java开发中,理解JVM的类加载机制对于优化性能、解决类冲突问题、实现自定义类加载器等都有重要意义。例如,...
Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件加载到内存中,进行一系列处理并使其成为可执行的Java类型。这个过程包括五个主要阶段:加载、验证、准备、解析和初始化。 1...
本专题"性能调优专题-jvm类加载机制-performance-jvmclassloader"深入探讨了如何通过理解并优化类加载过程来提升应用程序的性能。 1. **类加载器的层次结构** Java中的类加载器分为Bootstrap ClassLoader、...
#### 三、类加载过程详解 类加载的过程主要包括以下几个步骤: **3.1 加载** 在这个阶段,JVM根据类的全限定名读取对应的二进制数据流,并将其转换为JVM内部表示的`Class`对象。 **3.2 验证** 验证阶段是为了...
通过对Java中JVM加载`.class`文件的过程及其类加载器的具体工作原理的介绍,我们可以更加深刻地理解Java程序的运行机制。了解这些基础知识对于开发高质量的Java应用程序至关重要。通过掌握类加载器的工作方式,...
本文主要探讨JVM的类加载机制,包括类加载、连接、初始化等关键过程,以及类的主动使用和被动使用的情况。 首先,我们要理解**类加载**的作用。JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存...
首先,我们要知道Java程序的类加载过程通常分为三个阶段:加载、验证、准备、解析和初始化。其中,加载阶段就是JVM查找并解析字节码文件的过程。Java类的加载主要由类加载器完成,它分为引导类加载器(Bootstrap ...
当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关重要,同时也有助于深入理解Java虚拟机(JVM)的工作原理。 Java 类加载机制主要由类加载器...
类加载器在类加载过程中扮演重要角色,它负责找到类的字节流并将其转换为运行时可用的形式。系统提供了几个内置类加载器,如Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...
类缓存的主要问题在于,如果JVM加载了同名的类,会出现类冲突问题。解决类缓存问题的方法有多种,例如使用不同的类加载器加载同名的类,或者使用不同的命名空间来避免类冲突。 在JVM中,类加载器会将类加载到内存中...