JAVA虚拟机系列(一) 类的加载

目录

1 类的初始化过程

2 详解初始化时的各个阶段

一、类初始化的过程

先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class --->加载---->连接--->初始化---> 使用--->卸载。

我们将会在本章讨论一下xxxx.class--->加载--->连接---->初始化的过程。

讨论的方式采用自问自答模式:

1 首先类什么时候会被加载?

答:这一点JVM并没有强制约束,由不同的JVM供应商自行实现。但是是JVM规定了类初始化的有且只有的5种情况。

     a 对静态属性和方法进行读写、NEW一个实例

     b 通过反射Class.forName获取实例

     c 初始化子类时他的父类没有进行过初始化,则会触发父类的初始化

     d main函数入口的类

     e JDK1.7动态语言的支持MethodHandle(这个暂时不理解)

另外这里需要提醒一下

    A 接口的与类的区别,子类的初始化不会触发接口的初始化。

    B NEW一个数组类不会触发当前数组类型的类的初始化,但会初始化JAVA虚拟机里面的一个继承object的数组的子类

      例如 ClassArrayTest[] testArray = new ClassArrayTest[10] ,这句话不会初始化CLassArrayTest类的。

    C 常量final 修饰的static属性被读取时不会触发初始化的过程

2 加载阶段是做了什么?

答:首先“加载”和“类加载”别混淆,加载是类加载的其中一个步骤(同样的初始化是类加载的最后一步)。,

言归正传,JVM在类需要初始化时会先把Class文件转换成二进制模式放入JVM控制的内存里面的方法区中,这个过程叫做加载。

3 连接的阶段是做了什么?(详情在4,5,6一并回答)

答:连接阶段分为三个步骤:验证、准备、解析(解析的步骤不确定是否会执行,因为它的执行顺序可以由虚拟机调节)。

4 验证

答:这一阶段的目的是为了确保Class的正确性,从以下几个方面展开

1 文件格式

版本号是否符合当前JVM范畴

文件是否完整

2 元数据

语法是否符合规范

3 字节码

堆栈的操作是否合理

4 符号引用

类里面属性和方法的访问权限是否正确

5 准备

答:这一阶段是为类的静态属性附上初始值,比如 整形是0,浮点是0.0f/d 引用类型是null。

提醒一点:final常量在这里是直接进行赋值的,所以他不会触发初始化。

6 解析

答:解析阶段是把符号引用转为直接引用。什么是符号引用呢?比如一个类中有个属性是一个其他类的实例 A a = new A(); 其中a 就是符号引用。

 为什么需要这一步骤呢?按照我的理解是直接引用的意义明确而且无歧义,并且确保了被引用的对象一定已经创建(不创建哪来引用地址呢?)。

开始详解一下解析的过程。解析的过程分为2大块,类/接口解析与字段解析

     1 类/接口的解析(创建其他类并且获取指针的过程)

                   step1  确定被引用的是否为数组,如果是数组则由虚拟机加载表示当前数组维度的数组类

                   step2  如果不是数组,则把这个需要加载的类传递给当前类的加载器进行加载

                   step3 如果1,2都通过时,则检查被引用类的访问权限,失败会抛出illegalAccessError

     2 字段解析(在第一步的基础上把指针指向方法或者属性的过程)

   step1 在被引用的类里面寻找需要的属性和方法,找到返回。

                   step2 第一步未找到时,从下至上遍历他的父类和接口直到找到object类结束

                   step3 step1和step2 都未能找到时则抛出NoSuchFieldError

7 初始化阶段做了什么?

答:类加载的最后一步了。为所有静态变量赋值和执行静态块语句。

另外JVM是会确保类的初始化被正确的加锁,以避免并发的风险。(利用这个机制,我们再进行单例模式设计时会使用到。)

JVM虚拟机系列(一)类的加载的更多相关文章

  1. jvm系列 (五) ---类的加载机制

    类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...

  2. JVM详解之:类的加载链接和初始化

    目录 简介 加载 运行时常量池 类加载器 链接 验证 准备 解析 初始化 总结 简介 有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化 ...

  3. Java类的加载过程与ClassLoader的理解及测试

    当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...

  4. 【Java】学习路径63-反射、类的加载-附思维导图(完结)

    这一章的知识在实际开发也没有那么重要,主要是了解即可,另外掌握如何使用反射机制. 类的使用: 在虚拟机中: 类的加载->类的连接->类的初始化 类的加载   只会加载需要用到的类,加载到内 ...

  5. 类的加载classload和类对象的生成

    在Java中最重要的可以说就是类的加载了.不论我们编写的功能多么复杂,或是多么简单,永远逃离不开的,就是将这个类从class文件加载到JVM中来. 类的加载过程 首先我们要了解一下类的加载过程,包括: ...

  6. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  7. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  8. jvm系列一、java类的加载机制

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  9. 深入了解java虚拟机(JVM) 第十一章 类的加载

    一.类加载机制概述 虚拟机把描述类的数据从class文件加载到内存并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 二.类加载的机制 类加载的过程 ...

随机推荐

  1. linux 命令——19 find (转)

    Linux 下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所 以它的选项也很多,其中大部分选项都值得我们 ...

  2. 从.net到java,从基础架构到解决方案。

    这一年,职业生涯中的最大变化,是从.net到java的直接跨越,是从平台架构到解决方案的不断完善. 砥砺前行 初出茅庐,天下无敌.再学三年,寸步难行.很多时候不是别人太强,真的是自己太弱,却不自知. ...

  3. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。解决办法

    查一下数据库的UID数据是否格式正确,如: 错误格式1: {E056BB36-D824-4106-A9C3-D8D8B9ADC1C 错误格式2: E056BB36-D824-4106-A9C3-D8D ...

  4. 项目开发中dev、test和prod是什么意思

    开发环境(dev):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告. 测试环境(test):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常 ...

  5. MySQL - FULL JOIN

    SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...

  6. opengl 学习的链接,以后需要可以再来查需要的

    记录一些好的opengl学习站点,以供日后查阅: modern opengl tutorial : 一个英国的opengl学习网站 上面网站的中文版 日后发现新的再更新

  7. tp3.2框架中使用volist输出混乱的一点发现

    在tp框架中,volist真的是一样很好用的东西,但是要是不注意,用起来也会有问题的 在Controller层中,将数据assign到页面 $this->assign('vo',$news); ...

  8. 10.VUE学习之使用lodash库减少watch对后台请求的压力

    问题描述 使用watch监听库里word的值的变化,获取新值后,用oxios发送的ajax异步请求, 此时会多次发送请求,浪费服务器资料. 解决办法 使用lodash库里的_.debounce函数延缓 ...

  9. Python之路--Python初识

    Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程 ...

  10. python3爬虫之Urllib库(一)

    上一篇我简单说了说爬虫的原理,这一篇我们来讲讲python自带的请求库:urllib 在python2里边,用urllib库和urllib2库来实现请求的发送,但是在python3种在也不用那么麻烦了 ...