JVM虚拟机之类加载的过程

我们都知道JVM虚拟机的可执行文件为.class文件,那么什么时候JVM虚拟机会加载自己所需要的类呢?之前自己一直有这样的问题,上网找过好多网友的解释,感觉好像理解但是自己却无法说清楚,今天看了《深入理解JVM虚拟机》一书的讲解感觉自己有些透了,在此记录下来自己的理解~!

类的生命周期

类加载过程(主动|被动)

类的主动引用(一定会发生类的初始化)

- new一个类的对象

- 调用类的静态成员(除了final常量)和静态方法

- 使用java.lang.reflect包的方法对类进行反射调用

- 当初始化一个类,如果其父类没有被初始化,则先初始化他的父类

- 当要执行某个程序时,一定先启动main方法所在的类

类的被动引用(不会发生类的初始化)

- 当访问一个静态变量时,只有真正生命这个静态变量的类才会被初始化(通过子类引用父类的静态变量,不会导致子类初始化)

- 通过数组定义类应用,不会触发此类的初始化 A[] a = new A[10];

- 引用常量(final类型)不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)

类加载的阶段之加载

  • 通过一个类的权限定名来获取定义此类的二进制字节流
  • 将这些二进制流所代表的静态存储结构转化为方法去的运行时数据结构
  • 在堆中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据的访问入口

类加载的阶段之验证

是否符合JVM规范,没有安全问题。大致分为四个阶段:文件格式验证、元数据验证、字节码验证、符号引用验证

类加载的阶段之准备

为类变量(仅包括被static修饰的变量)分配内容并设置类变量初始值的阶段,这些变量所使用的内存都将在方法去中进行分配。

类加载的阶段之解析

解析阶段是虚拟机将常量池的符号引用替换为直接引用的过程。(A.a = “Hello”替换为A.a指向“Hello”的地址)

类加载的阶段之初始化

初始化阶段时执行类构造器()方法的过程,()方法是由变一起自动手机类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

- 执行顺序为语句在源文件中出现的顺序(静态语句块只能访问定义在其之前的变量;定义在它之后的变量可以复制,但不能访问)

- 执行当前类的()方法时,其父类的方法已经执行完毕

父类的方法先执行,也就意味着父类中定义的静态语句块要优于子类的变量赋值操作

- 虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步

- 接口与类的初始化不同的是,执行接口的方法不需要先执行父类的方法,只有当父类接口中定义的变量使用时,父类接口才会初始化

类加载的阶段之类的使用过程

//详情请见代码

类加载的阶段只类的卸载过程

在Java虚拟机中类的生命周期和对象的生命周期很相似。虚拟机创建并初始化对象,使程序使用对象,然后在对象变得不再被引用后可选地进行垃圾收集。同样,虚拟机装载、连接并且初始化类,使程序能使用类,当程序不再引用他们的时候可选的卸载它们。如果程序不再引用某类型,那么这个类型就变成不可触及,所以可以被垃圾收集(俗称GC)。但需要注意的是JVM自带的类加载器(PS:Bootstrap、ExtClassLoader、AppClassLoader)装载的类型永远是可触及的,所以永远不会被卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及的,从而被虚拟机回收。

时间: 2024-08-06 15:58:55

JVM虚拟机之类加载的过程的相关文章

读《jvm虚拟机》- 对象创建过程

java是面向对象的语言,与对象息息相关, 无时无刻都在创建对象, 对于创建对象,最熟悉的就是new 一个对象出来. Object obj = new Object(); 那么这个new 的过程在虚拟机之中又是怎么实现的呢? 通过阅读<JVM虚拟机>2.3.1对象的创建,简单总结了一下对象创建的过程. 个人见解: 1.虚拟机接收new指令 2.虚拟机接收new指令,检查类加载情况: 当虚拟机遇到一个new指令的时候,首先会去检查该指令中的参数,看是否能在常量池中定位到一个类的符号引用. ps:

JVM学习记录-类加载的过程

类的整个生命周期的7个阶段是:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸载(Unloading). 类加载的全过程主要包括:加载.验证.准备.解析.初始化这5个阶段的内容. 加载 加载是类加载过程的一个阶段, 在加载阶段JVM需要完成以下3件事情: 通过一个类的全限定明来获取定义此类的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区运行时数据结构

Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2

1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父

JVM运行和类加载过程

JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.html) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身栈区:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象

Java虚拟机JVM学习05 类加载器的父委托机制

Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(System) 2.用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式. JVM自带的加载器 Java虚拟机自带了以下几种加载器. 1.根(Bootstrap)类加载器: 该加载器没有父加载器. 它

[jvm学习笔记]-类加载过程

JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的 java.lang.class 对象,作为方法区这个类的各种数据的访问入口 相对于类加载过程的其他阶段,一个非数组类(数组类是由jvm虚拟机直接创建的)的加载过程(加载阶段获取类的二进制字节流的动作)是开发人员可

Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用

1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父

深入理解JVM(九)——类加载的过程

通过之前的介绍可知,类加载过程共有5个步骤,分别是:加载.验证.准备.解析.初始化.其中,验证.准备.解析称为连接.下面详细介绍这5个过程JVM所做的工作. 加载 注意:"加载"是"类加载"过程的第一步,千万不要混淆. 1. 加载的过程 在加载过程中,JVM主要做3件事情: 通过一个类的全限定名来获取这个类的二进制字节流,即class文件: 在程序运行过程中,当要访问一个类时,若发现这个类尚未被加载,并满足类初始化时机的条件时,就根据要被初始化的这个类的全限定名找到

Jvm类加载的过程

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