类加载生命周期

类加载生命周期:加载、验证、准备、解析、初始化、使用、卸载

类加载或初始化过程什么时候开始?

  1. 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时。
  2. 使用反射时,如果类没有初始化就触发其初始化
  3. 当初始化一个类时,如果其父类还没有初始化,则先初始化其父类
  4. 当虚拟机启动时,需要初始化主类。

类加载阶段

类加载的过程:

  1. 通过一个类的完全限定名获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的访问入口

验证阶段

验证是链接的第一步,这一阶段的主要目标是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求。

  1. 文件格式验证
  2. 元数据验证
  3. 字节码验证

Halting Problem 通过程序去校验程序逻辑是无法做到绝对准确的。

为了优化验证效率,Code属性中增加了一项名为StackMapTable的属性,JDK1.6 虚拟机提供了 -XX:-UseSplitVerifier选项来关闭这项优化。

4.符号引用验证

准备阶段

准备阶段是正式为类变量分配内存并设置初始值的阶段,注意这里的类变量非实例变量,初始值也仅仅是0值,或字段的属性表中存在ConstantValue,那么在准备阶段字段会被初始化为ConstantValue属性所指定的值。

解析阶段

解析阶段是虚拟机将内存常量池内的符号引用转换为直接引用的过程。

什么时候发生解析呢? 答案是当用于操作符号引用的字节码被执行的时候,如new、getfield、invokevirtual

符号引用解析的范围包括:类或接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符

初始化阶段

初始化阶段是执行类构造器()方法的过程,() 方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并而成。父类的()要先于子类执行。

接口虽然没有静态代码块,但是编译器也会为其生成()方法,用于借口中定义的变量的初始化。

虚拟机会保证一个类的()方法在多线程的环境中被正确的枷锁、同步,其他线程会阻塞,()方法只会被执行一次。

类加载器

每一个类加载器,都拥有一个独立的类名称空间,即使同样一个类被不同的两个类加载器加载,也被JVM认为是两个不同的类。

双亲委派模型 Parents Delegation Model

从JVM的角度讲只有两种类加载器,一种是启动类加载器(Bootstrap ClassLoader),一种是所有其他类加载器。

从开发者的角度看,类加载器可以分为三种:

  1. 启动类加载器 Bootstrap ClassLoader,这个类加载器负责加载jdk/lib目录中的类,如rt.jar
  2. 扩展类加载器 Extension ClassLoader,这个加载器由sun.misc.Launcher$ExtClassLoader实现,他负责加载jdk/lib/ext目录中的类。
  3. 应用程序类加载器,这个加载器由sun.misc.Launcher$AppClassLoader实现,这个类加载器是ClassLoader.getSystemClassLoader()方法的实现,所以也称为系统类加载器,它负责加载用户类路径ClassPath上所指定的类库。

下图展示的类加载器之间的关系,称为类加载器的双亲委派模型

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时,子加载器vaihui尝试自己去加载。

实现一个满足双亲委派模型的类加载器只要继承ClassLoader,实现模型的方法都集中在loadClass中,只要自己实现findClass中自己查找的逻辑即可。

破坏双亲委派模型,上一级的类加载器要访问下级类加载器加载的类时,可以通过线程上下文类加载器 Thread Context ClassLoader 这个类加载器可以通过Thread类setContextClassLoader()方法进行,这个值可以从父线程继承,如果没有进行设置默认就是应用程序类加载器。

参考资料

本文参考:《深入理解Java虚拟机》

JVM学习笔记五:虚拟机类加载机制的更多相关文章

  1. JVM学习笔记(四):类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 一.类加载的时机1. 类从被加载到虚拟机内存 ...

  2. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  3. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  4. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  5. 《深入理解 Java 虚拟机》读书笔记:虚拟机类加载机制

    正文 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 一.类加载的时机 1.类的生命 ...

  6. 【JVM学习笔记】双亲委托机制存在的意义

    1.可以确保Java核心库的类型安全:所有的Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.lang.Object这个类会被加载到Java虚拟机:如果用户自定义 ...

  7. java jvm学习笔记五(实践自己写的类装载器)

     欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和 ...

  8. JVM学习笔记:虚拟机性能监控

    JDK中除了包含与开发密切相关的jar包外,还包含了很多非常实用的工具.在%JAVA_HOME%\bin\目录下面除了命令行工具外,还包括了几个强大的可视化工具.这些工具可以辅助我们开发.调试应用程序 ...

  9. 【JVM学习笔记】系统类加载器

    可以通过“java.system.class.loader"属性指定系统类加载器 默认情况下,该属性值为空: public class Test { public static void m ...

随机推荐

  1. 【LeetCode】205. Isomorphic Strings

    题目: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the c ...

  2. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 分享几个 git 的使用场景

    你真的会使用 git 吗?你能回答下面几个问题吗? 有三个commit(顺序:CommitA.CommitB.CommitC),它们相互独立,没有依赖. 在不修改B.C的前提下,修改A,怎么操作? 合 ...

  4. 14.什么是jsp动作

    JSP动作元素(action elements),动作元素为请求处理阶段提供信息.动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选的内容,与开始标签匹配的结束标签. 包含的类 ...

  5. 从一个针对ASP.NET MVC框架的Controller.Action的请求处理顺序来说整个请求过程。

    下面引用的所有代码都来自ASP.NET MVC的源码,但是可能只选取每个方法的其中一部分. System.Web.Routing.UrlRoutingModule在管道事件中注册PostResolve ...

  6. LCS 算法实现

    动态规划算法 #include <iostream> #include <string.h> #include <algorithm> #include <m ...

  7. 欢迎大家Follow me!微软MVP罗勇(Dynamics CRM方向)欢迎您!

    我是一名八零后,来自湖南乡村,2002年毕业于大连大学工商管理专业,主要靠自学走上了编程之路.从2012年开始接触Dynamics CRM 2011,一直从事Dynamics CRM方面工作,熟悉Dy ...

  8. C++中使用const修饰指针

    在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰: 1.指向非常量数据的常量指针 对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指 ...

  9. 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...

  10. nyoj_78:圈水池(凸包入门)

    题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓"勾勒"出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后 ...