JVM类加载

也许我们对JVM很陌生,但是我们对基于配置的框架应该比较熟悉。我们暂且认为我们是在加载一个简单的xml,并且并不关心具体细节

XML加载

  • 定位/加载 Java原生的URL定位/Spring中的上级抽象Resource
  • 验证 基于DTD格式的验证/基于XSD格式的验证
  • 解析 DOM解析/SAX解析
  • 初始化 根据XML中的定义执行自定义逻辑

JVM加载类的字节码其实跟程序加载XML极其类似,却远比XML复杂。

JVM类加载

加载

JVM加载阶段虚拟机规范定义了需要完成三件事情

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

这三条并不算具体,因此虚拟机实现与具体应用的灵活度的实现都相当的大。

可能的加载来源

  • 从ZIP包中读取 JAR/EAR/WAR
  • 从网络中获取 Applet
  • 运行时动态生成 动态代理技术
  • 由其它文件生成 JSP/JSF
  • 从数据库中读取 相对少见 SAP Netweaver

加载来源的抽象
java将不同来源的资源抽象成URL,通过注册不同的handler(URLStreamHandler)来处理不同来源的资源的读取逻辑。然而一般的框架(或者说程序)都会定义来源的上层抽象,Spring的加载XML时定义的是Resource,JVM的定义的则是Repository。

验证

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。这是一个非常重要的但不是必要的阶段。可以考虑在实施阶段使用-Xverify:none参数来关闭大部分的类的验证以缩短虚拟机类加载的时间

验证的四个步骤

  • 文件格式验证
  • 元数据校验
  • 字节码验证
  • 符号引用校验

更多请移步java虚拟机规范

准备

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

  public static int value1 = 123;    //分配后为0
  public final static int vaule2 = 123;  //分配后为123

解析

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

符号引用与直接引用

虚拟机规范并未规定解析阶段发生的具体时间,只要求在执行了anewarray/checkcast/getfield等一共16个用于操作符号引用的字节码指令之前,需要先对它们所使用的符号引用进行解析,所以虚拟机的具体实现可能不同。

解析类别

  • 类或接口的解析
  • 字段解析
  • 类方法解析
  • 接口方法解析
  • 方法类型和方法处理解析
  • 调用点描述符解析

更多请移步java虚拟机规范

初始化

类的初始化是类加载过程的最后一部,到了初始化阶段就真正开始执行类中定义的java字节码了。

参考

《深入理解JAVA虚拟机》第二版
由于现在jdk已经到了11,书算是比较老。具体细节和更多信息可以直接阅读虚拟机规范

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,确实编译语言发展的一大步。 虚拟机把描述类的数据从...
    胡二囧阅读 952评论 0 0
  • JVM类加载机制 概述 类加载过程 加载 通过类的全限定名获取类的二进制流 将静态存储结构转化为方法区的运行时数据...
    东溪95阅读 3,031评论 0 15
  • 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的...
    丑人林宗己阅读 567评论 0 2
  • 所谓类加载机制,就是虚拟机把描述类的数据从Class文件加载到内存中,并对其进行校验,转换,分析以及初始化,并最终...
    登高且赋阅读 1,183评论 0 15
  • 原文地址[http://blog.csdn.net/ns_code/article/details/1788158...
    期待现在阅读 257评论 0 2