类加载机制

  谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的小问题铺垫了一下,然后接下来的问题就是简单的说一下类加载机制,听到这个问题,我脑子里面想到这个问题我看过,在《深入理解Java虚拟机》这本书上看到过这个原理,但是只是很浅显的翻看了一下,并没有下功夫去了解其中的原理。然后就大脑一片空白,什么也想不到了,支支吾吾没有回答上来,这就gg了,当时羞愧得想着赶紧逃走。果然基础不牢,地动山摇啊,对于我这种半路出家的,还是要打好基础。

  每次看到类加载机制的问题,心里就会想起那次面试,都快成了阴影了,虽然现在能回答上来一些,在这里还是通过书来系统的理解一下。

  本博客内容大部分参考自《深入理解Java虚拟机》第二版 周志明 著

类加载过程

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

  类从被加载到虚拟机内存中开始,到卸载出内存,整个生命周期包括:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using),卸载(Unloading。其中验证、准备、解析这3个部分统称为连接。这7个阶段的发生顺序如图所示

加载

加载时类加载的第一个阶段。在加载阶段,虚拟机完成的事情是:

         1、通过一个类的全限定名来获取定义此类的二进制字节流,获取.class文件的二进制流

    2、将类信息、静态变量、字节码、常量这些.class文件中的内容放入方法区中。

         3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据结构。然后再内存中实例化一个java.lang.Class类的对象(并没有明确规定是在Java堆中,对于HostSpot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区里面),这个对象将作为程序访问方法区中的这些类型数据的外部接口。

加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

验证

  验证是连接阶段的第一步。这个阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  Java语言是相对安全的语言,使用纯粹的Java代码无法做到诸如访问数组边界以外的数据、将一个对象转型为它并未实现的类型、跳转到不存在的代码之类的事情,如果这样做了,编译器将拒绝编译。但是Class文件并不一定要求用Java源码编译而来,可以使用任何途径产生,甚至包括十六进制编译器直接编写来产生Class文件。在字节码语言层面上,上述Java代码无法做到的事情都是可以实现的,至少语义上是可以表达出来的。虚拟机如果不检查输入的字节流,对其完全信任的话,很可能会因为载入了有害的字节流而导致系统崩溃,所以验证是虚拟机对自身保护的一项重要工作。

  验证阶段大致上会玩完成下面4个阶段的检验动作:文件格式验证、元数据验证、字节码验证、符合引用验证。

准备

  准备阶段是正式为类变量分配内存并设置其初始值的阶段,这些变量所使用的内存都将在方法区中分配。

  1、这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将在对象实例化时随着对象一起分配在Java堆中。

  2、这里说的初始值通常情况下是数据类型的零值。比如"public static int value = 123;",value在准备阶段过后是0而不是123,给value赋值为123的动作将在初始化阶段才进行;比如"public static final int value = 123;"就不一样了,在准备阶段,虚拟机就会给value赋值为123。

解析

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

 

初始化

  初始化是类加载过程的最后一步,初始化阶段是真正执行类中定义的Java程序代码的过程。

  在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。初始化阶段就是给static变量赋予用户指定的值以及执行静态代码块。

  博主初入Java,对加载机制更深层的东西理解尚浅,想更深入的学习类初始化的知识可以阅读下面大神的博客

推荐博客

[1] 【深入Java虚拟机】之四:类加载机制

http://blog.csdn.net/ns_code/article/details/17881581

[2] JAVA类加载机制详解

http://www.cnblogs.com/dongguacai/p/5860241.html

[3] Java虚拟机类加载机制

http://www.importnew.com/18548.html

深入理解Java虚拟机---类加载机制(简略版)的更多相关文章

  1. 深入理解Java虚拟机类加载机制

    1.类加载时机 对于类加载的第一个阶段---加载,虚拟机没有强制的约束,但是对于初始化阶段,虚拟机强制规定有且只有以下的5中情况必须开始初始化,当然,加载.验证.准备阶段在初始化前就已经开始. ①使用 ...

  2. 《深入理解Java虚拟机》第 3 版里面到底多了哪些知识点?本文竟然得到了本书作者的认可!

    这是why的第 47 篇原创文章 荒腔走板 大家好,我是 why.老规矩,先是简短的荒腔走板聊聊生活. 上面的图是前几天拍的,那天晚上下班后,刚刚走进小区就看到了这一轮弯月和旁边那一颗特别特别亮的星星 ...

  3. 深入理解Java虚拟机(第2版) 笔记目录

    本篇为读深入理解Java虚拟机(第2版)一书的笔记目录. Java 运行期数据区 Java 垃圾回收算法 Java 内存分配策略 Java 类文件结构 Java 加载.链接.初始化 Java 类加载器

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

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

  5. [转]Java虚拟机类加载机制

    原文地址:http://blog.csdn.net/u013256816/article/details/50829596 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎 ...

  6. 《深入理解Java虚拟机》第2版挖的坑终于在第3版中被R大填平了

    这是why技术的第34篇原创文章 本周还是在家办公的一周,上面的图就是我在家的工位,和上周<Dubbo Cluster集群那点你不知道的事>这篇文章里面的第一张图片比起来,升级了显示器支撑 ...

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

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

  8. 【转载】Java虚拟机类加载机制与案例分析

    出处:https://blog.csdn.net/u013256816/article/details/50829596 https://blog.csdn.net/u013256816/articl ...

  9. Java虚拟机类加载机制——案例分析

    转载: Java虚拟机类加载机制--案例分析   在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...

随机推荐

  1. CVE-2017-11882漏洞复现

    作者:zero 漏洞信息:CVE-2017-11882 2017年11月14日,微软发布了11月份的安全补丁更新,其中比较引人关注的莫过于悄然修复了潜伏17年之久的Office远程代码执行漏洞(CVE ...

  2. ie 8及以下 前端cors ajax跨域须知

    http://www.cnblogs.com/xishuai/p/jquery-ajax-ie8-cors.html

  3. Mysql 四种事务隔离介绍以及锁机制

    还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...

  4. 教你制作自己logo专属的图片

    说明:以下教程仅适合对图片分辨率要求不高的情况. 第一步:使用Windows自带的画图工具新建一个250像素*250像素的空白图片. 第二步:使用形状中的三角形,按住Shift键,将三角形拖拉至合适的 ...

  5. java ListNode链表数据结构

    class ListNode{ int val; ListNode next; } 该节点的值 val.   下一个节点  next

  6. 【实战】某项目SQL注入引发的思考

    数据包: 测试参数:username,测试payload: ' ' or '1'='1 ' or '1'='2 响应结果都未发生任何变化,借助sqlmap测试,结果一样: 尝试在or前面进行简单的fu ...

  7. 【实战】Axis2后台Getshell

    实战遇到的情况---任意文件读取,读取/conf/axis2.xml内容,读取用户名和密码登录后台 当然弱口令也是屡试不爽的. 操作起来 1.上传cat.aar(链接:https://pan.baid ...

  8. SpringMVC初写(二)映射类型、限制和数据绑定

    映射路径 a)映射路径的概述 所谓的映射路径,就是匹配请求路径和执行方法关系的路径 请求路径:http://localhost:8080/springmvc-demo-cofig/say.do 映射路 ...

  9. solr实时更新mysql数据的方法

    第一步:创建core core是solr的特有概念,每个core是一个查询数据,.索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新core:名字[core1] 进入linux命令行,进入 ...

  10. c++ 网络编程(十一) LINUX下 初步制作基于HTTP的WEB服务器

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html HTTP概要 理解Web服务器端: 编写HTTP(超文本传输协议)服务器 ...