前面给大家讲解了 Java 虚拟的内存结构 以及 Java 虚拟机的垃圾回收机制,我们更加明白了 Java 的内存管理机制,今天我们来讲讲 Java 虚拟机的另外一个高频考点:类加载机制。

JVM 的类加载过程分为加载、验证、准备、解析、初始化 5 个阶段。

加载

加载阶段由类加载器进行负责,类加载器根据一个类的全限定名读取该类的二进制字节流到 JVM 内部,然后转换为一个对应的 java.lang.Class 对象实例;一个类由类加载器和类本身一起确定,所以不同类加载器加载同一个类得到的 java.lang.Class 也是不同的。

验证

验证阶段负责验证类数据信息是否符合 JVM 规范,是否是一个有效的字节码文件。

准备

准备阶段是正式为类变量(static 修饰的变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区进行分配。

这个阶段由两个容易产生混淆的概念需要强调一下,首先是这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。其次这里所说的初始值在没有被 final 修饰的时候都是数据类型的零值,只有类似 public static final int value = 1024 这样的情况下才回直接被赋值 123。

解析

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

初始化

初始化阶段负责将所有的 static 域按照程序指定操作对应执行(赋值 static 变量,执行 static 块)。

上述阶段通常都是交叉混合允许,没有严格的先后执行顺序。

双亲委派模型

站在 Java 虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器,这个类加载器使用 C++ 语言实现,是虚拟机自身的一部分,另外一种是所有其他的类加载器,这种类加载器都由 Java 语言实现,独立于虚拟机外部,并且全部继承自抽象类 java.lang.ClassLoader

双亲委派模型并不是一个强制性的约束模型,而是 Java 设计者们推荐给开发者们的类加载器实现方式。它的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的类加载器中,只有当父加载器反馈自己完成这个加载请求的时候,子加载器才会尝试自己去加载。

使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处就是 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。

采用双亲委派模型的原因

比如黑客定义一个 java.lang.String 类,该 String 类和系统 String 类有一样的功能,只是在某个方法比如 equels() 中加入了病毒代码,并且通过自定义类加载器加入 JVM 中,如果没有双亲委派模型,那么 JVM 就可能误以为黑客编写的 String 类是系统 String 类,导致「病毒代码」最终被执行。而有了双亲委派模型,黑客定义的 java.lang.String 类就用于不会被加载进内存,因为最顶端的类加载器会加载系统的 String 类,最终自定义的类加载器无法加载 java.lang.String 类。

可以通过重写 loadClass() 方法,打破双亲委派模型。

最近的知识比较枯燥,但还是我们所必须了解的。

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

每日一问:讲讲 JVM 的类加载机制的更多相关文章

  1. 面试官,不要再问我“Java虚拟机类加载机制”了

    关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...

  2. 面试官,不要再问我“Java虚拟机类加载机制”了(转载)

    关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...

  3. JVM内存结构 JVM的类加载机制

    JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...

  4. JVM之类加载机制

    JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...

  5. JVM的类加载机制全面解析

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

  6. 大白话谈JVM的类加载机制

    前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...

  7. 一文教你读懂JVM的类加载机制

    Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运 ...

  8. JVM学习——类加载机制(学习过程)

    JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...

  9. JVM的类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备 ...

随机推荐

  1. thinkphp 分页类 url 编码处理

    在做thinkphp分页的时候  thinkphp 中的分页 有一个小问题 就是 在有form 表单 搜索中文的时候,点击下一页的话 中文会被转换成编码. 如图: 最直接的方法就是 直接修改 thin ...

  2. SQLServer之服务器连接

    目录 SQL Server Management Studio连接 CMD命令行窗口连接 通用数据连接文件连接 SQL Server Management Studio连接 定义 SQL Server ...

  3. git 命令从入门到放弃

    o(︶︿︶)o  由于项目使用 git 作为版本控制工具,自己可以进行一些常用操作但是有时候还是会忘掉,导致每次遇到 git 命令的使用问题时就要再查一遍,效率就立马降下来了,所以今天就来一个从头到尾 ...

  4. 《EOPL》 : CPS风格真是神奇

    计算的栈好像可以随便跳转了一样. Exception 的 try/catch , resume机制都可以借此实现 还可以实现 Erlang中的 spawn,线程调度器,以及基本的 Mutex 同步机制

  5. 1.Shell特殊位置变量

    $0    文件名及路径 $1,$2    参数1,参数2 , 也可以用${1}  和 ${2} 来表示 $#    传递给脚本或函数的参数个数 $$    当前Shell进程ID $?    判断上 ...

  6. bash信号捕捉

    我们ping一个主机,然后按下ctrl+c那么就会终止这个ping动作,如下图: 可是如果使用一个循环来逐个ping不同主机,你再按下ctrl+c就会发现停不下来,直到循环完成,如下图: #!/bin ...

  7. logger.info占位符的使用

    {}表示占位符,使用方法如下: package org.pine.controller; import javax.annotation.Resource; import org.pine.servi ...

  8. Stage3D大冒险

    摘自:http://dreamana.com/weblog/?p=92 摘自:http://baike.baidu.com/view/6794042.htm Stage3D的Flash Player和 ...

  9. JavaWeb 发送邮件

    我们可以使用第三方的邮箱服务器来发送邮件. 常用的邮件传输协议有2种:POP3/SMTP.IMAP/SMTP. POP和IMAP的区别:在邮箱客户端的操作,比如移动邮件.标记已读,如果使用POP,是不 ...

  10. Spark GraphX图计算核心算子实战【AggreagteMessage】

    一.简介 参考博客:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package graphx import org.apache.log4j ...