Java类加载机制

Java类加载的生命周期

加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
加载、验证、准备、初始化和卸载 这五个阶段的顺序是确定的。

Java类加载的时机

  1. 遇到 new、getStatic、setStatic、invokeStatic这四条字节码指令的时候。
    (使用new关键字初始化实例对象读取/设置一个类的静态字段(被final修饰、已经在编译器放入常量池的静态字段除外)、调用一个类的静态方法
  2. 使用 java.lang.reflect进行反射调用的时候。
  3. 当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类
  4. 虚拟机启动的时候,需要初始化main函数所在的类

上面的四种场景的行为被称为对一个类的主动引用。除此之外的引用类的方式

Java类的加载

Java类的加载是Java类加载过程的第一个阶段,需要做的事情有:

  • 通过一个类的全限定名来获取定义此类的二进制流
    (获取的方式,可以是zip(jar包、EAR/WAR格式)的包、网络中获取、JSP文件生成等)
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    (方法区就是用来存放已加载的类信息、常量、静态变量、编译后的代码的运行时区域)
  • 在Java堆中生成一个代表这个类的java.lang.class对象,作为方法区这些数据的访问入口

Java类的连接

1. 验证

确保Class文件的字节流中包含的信息符合当前的虚拟机的要求,并且不会危害虚拟机自身的安全
主要包含以下四个阶段:

  • 文件格式验证:验证字节流是否符合Class文件格式的规范,并且能被当前的虚拟机处理。
  • 元数据验证:对字节码描述的信息进行语义分析,确保描述的信息符合Java语言规范的要求。
  • 字节码验证:对数据流与控制流进行分析,确保被检验类的方法在运行时不会做出危害虚拟机安全的行为。
  • 符号引用验证:对类自身以为(常量池中的各种符号引用)的信息进行匹配性的校验。

2. 准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段
注意
首先是这时候进行内存分配的仅包括类变量(被static修饰的变量),不包括实例变量。实例变量将会在对象实例化时随着对象一起分配在Java堆中。
其次这里所说的初始值通常情况下是数据类型的零值

这里示例讲解一下通常情况
假设一个类变量的定义为:

public static int value = 123;

那么变量value在准备阶段过后的初始值为0而不是123,因为这时候尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是程序被编译后,存放与类构造器<clinit>()方法之中,所有把value赋值为123的动作将在初始化阶段才会被执行。

特殊情况
如果类字段的字段属性表中存在ConstantValue属性,那在准备阶段变量value就会被初始化为ConstantValue属性所指定的值。

public static final int value = 123;

编译时Javac将会为value生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123。

3. 解析

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

  • 类或接口的解析
  • 字段解析
  • 类方法解析
  • 接口方法解析

Java类的初始化

类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与外,其余动作完全由虚拟机主导和控制。初始化阶段才真正执行类中定义的Java程序代码(或者说是字节码)。

在准备阶段,变量已经赋过一次系统要求的初始值。
初始化阶段是执行类构造器<clinit>()方法的过程

主要阅读《深入理解Java虚拟机》一书

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

推荐阅读更多精彩内容

  • 一个Java对象的创建过程往往包括 类初始化 和 类实例化 两个阶段。本文讨论的是『类初始化』的时机,以及利用这一...
    NoahU阅读 2,088评论 0 2
  •   最近在看回顾Java基础的时候,发现看似很简单的类初始化的顺序却并不是那么简单(往往越是简单的东西反而越容易出...
    BrightLoong阅读 1,489评论 0 2
  • 在java中,一个类被使用要经过装载,连接,初始化这样的过程 一、装载: 类装载器(Bootstrap Class...
    暮雨沉沦阅读 593评论 0 0
  • 这票文章主要想来说一下Java类各部分(非静态字段初始化、非静态块、静态字段初始化、静态块、构造函数)的执行顺序。...
    第四单元阅读 421评论 0 2
  • 哎呀,这个太难画了。我都使出来洪荒之力了,难为死宝宝了!不过经过我这么些天不懈努力,终于能勉强拿出来见人了,也算是...
    萍手绘阅读 953评论 4 5