`
greemranqq
  • 浏览: 974698 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

JVM 类加载过程

    博客分类:
  • JVM
阅读更多

这里简单记录一下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.

0
0
分享到:
评论

相关推荐

    JVM类加载过程.pptx

    JVM类加载过程 JVM(Java Virtual Machine)是Java语言的核心组件之一,它是Java语言的可移植性和跨平台性的基础。JVM主要组成部分包括类加载子系统、执行引擎、本地方法接口和运行时数据区。 类加载子系统是JVM的...

    JVM实战-JVM类加载机制案例分析

    **案例背景**:本案例通过编写一个简单的Java程序,使用单例模式初始化静态变量和对象,来演示类的加载过程以及类加载器的委托机制。 **案例源码**: ```java public class Singleton { private static Singleton...

    JVM类加载机制详细讲解

    类加载过程中可能会遇到一些问题,如类冲突、类循环依赖等。类冲突通常发生在不同加载器加载了相同包名下的类,导致版本不一致。类循环依赖则可能引发无限递归,使得类加载失败。解决这些问题通常需要对类加载器的...

    JVM类加载分析

    类的加载过程包括三个主要步骤:加载、连接和初始化。 1. 加载:读取.class文件并生成对应的Class对象。这个过程可能涉及文件查找、解压等操作。 2. 链接:分为验证、准备和解析三个阶段。 - 验证:确保被加载的...

    JVM类加载器说明文档

    总结,Java 类加载器是JVM中的重要组成部分,它决定了类的加载过程和加载源,双亲委派机制保证了类加载的有序性和安全性。理解类加载器的工作原理有助于我们更好地进行程序设计和优化,特别是在开发插件系统、模块化...

    java JVM 类加载-初始化 过程

    java JVM 类加载-初始化 过程

    Java虚拟机JVM类加载初始化

    加载过程中,字节码被转换为内存中的数据结构,并在方法区(在JVM规范的早期版本中称为永久代,现代JVM中称为元空间)中存储。同时,会在堆中创建一个`java.lang.Class`对象,作为方法区数据的封装。 2. 连接(Link...

    从JDK源码级别剖析JVM类加载机制

    双亲委派模型的工作流程是:从顶层的Bootstrap ClassLoader开始,逐级向下尝试加载类,直到找到能加载的类为止。 通过深入JDK源码,我们可以更清晰地理解类加载机制的细节,从而在遇到问题时能迅速定位并解决。对于...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    被动使用则是在JVM运行过程中,由于JVM或JDK内部需要而进行的加载,如JNI查找类、JDK工具类的使用等。 在Java开发中,理解JVM的类加载机制对于优化性能、解决类冲突问题、实现自定义类加载器等都有重要意义。例如,...

    JVM类加载机制1

    Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件加载到内存中,进行一系列处理并使其成为可执行的Java类型。这个过程包括五个主要阶段:加载、验证、准备、解析和初始化。 1...

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    本专题"性能调优专题-jvm类加载机制-performance-jvmclassloader"深入探讨了如何通过理解并优化类加载过程来提升应用程序的性能。 1. **类加载器的层次结构** Java中的类加载器分为Bootstrap ClassLoader、...

    深入Java虚拟机JVM类加载学习笔记

    #### 三、类加载过程详解 类加载的过程主要包括以下几个步骤: **3.1 加载** 在这个阶段,JVM根据类的全限定名读取对应的二进制数据流,并将其转换为JVM内部表示的`Class`对象。 **3.2 验证** 验证阶段是为了...

    jvm 加载class文件

    通过对Java中JVM加载`.class`文件的过程及其类加载器的具体工作原理的介绍,我们可以更加深刻地理解Java程序的运行机制。了解这些基础知识对于开发高质量的Java应用程序至关重要。通过掌握类加载器的工作方式,...

    Java虚拟机JVM类加载学习笔记

    本文主要探讨JVM的类加载机制,包括类加载、连接、初始化等关键过程,以及类的主动使用和被动使用的情况。 首先,我们要理解**类加载**的作用。JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存...

    jvm字节码自动加载

    首先,我们要知道Java程序的类加载过程通常分为三个阶段:加载、验证、准备、解析和初始化。其中,加载阶段就是JVM查找并解析字节码文件的过程。Java类的加载主要由类加载器完成,它分为引导类加载器(Bootstrap ...

    Java类加载原理解析

    当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关重要,同时也有助于深入理解Java虚拟机(JVM)的工作原理。 Java 类加载机制主要由类加载器...

    JVM(三):类加载机制(类加载过程和类加载器)1

    类加载器在类加载过程中扮演重要角色,它负责找到类的字节流并将其转换为运行时可用的形式。系统提供了几个内置类加载器,如Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...

    详解JVM类加载机制及类缓存问题的处理方法

    类缓存的主要问题在于,如果JVM加载了同名的类,会出现类冲突问题。解决类缓存问题的方法有多种,例如使用不同的类加载器加载同名的类,或者使用不同的命名空间来避免类冲突。 在JVM中,类加载器会将类加载到内存中...

Global site tag (gtag.js) - Google Analytics