虚拟机(JVM)如何加载类
首先JVM加载类的一般流程分三步:
- 加载
- 链接
- 初始化
那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发。Java分基本类型和引用类型。其中按照面向对象的特性,一切皆对象,那么对于基本类型也应该是对象。但是为了在执行效率和内存占用上进行调优,Java将基本类型特殊处理。所以Java基本类型加载都是Java虚拟机预先定义好了,所以没有加载这个步骤了。引用类型就是类,接口,数组。其中数组是直接由虚拟机直接生成的。类和接口是字节流,都是需要加载。
正文
Java基本类型
首先先看下基本类型的默认值和值域。
总结
1.无符号类型:boolean和char
2.boolean在Java虚拟机中,根据虚拟机规范转换为int类型,false为0,true为1
引用类型
引用类型中的数组是直接由Java虚拟机直接生成,接下来直接讲类和接口。为了叙述方便直接统称为类。类的加载分三步。
加载
加载是通过加载器进行加载的。Java虚拟机有个一加载机制,叫做双亲委派模型。具体就是当一个类加载器拿到这个类的时候先给自己的父类加载器进行加载,如果父类加载器没有找到所请求的类,才会给该类加载器。还是挺尊老爱幼的。那么加载器有很多中,在Java9之前分三类。Java9之后分两类。
分类:
Java9之前
- 启动类加载器:负责加载最为基础和最为重要的类。比如存放在jre的lib目录的jar包中的类以及虚拟机参数-Xbootclasspath指定的类。
- 扩展类加载器:扩展类加载器的父类的加载器是启动类加载器。扩展类加载器加载相对次要但是又通用的类。比如jre中lib/ext目录下的jar包中的类以及由系统变量java.ext.dir指定的类。
·应用类加载器:应用类加载器的父类加载器是扩展类加载器。负责加载应用加载应用程序路径的类(这里的应用程序的路径就是虚拟机参数-cp/-classpath,系统变量java.class.path或环境变量CLASSPATH指定的路径)。
Java9之后
启动类加载器:同上
平台类加载器:Java9引入模块系统,所以除了少数的几个关键模块是用启动类加载器加载,其余的都有平台类加载器加载。
类加载器除了提供加载功能,还提供命名空间的功能,这个就很像Java的包名一样。即时是同一个类,经过不同的类加载器,命名不同那这两个类也是不是同一个类。
(ps:
** 启动类加载器:由java虚拟机直接生成,是由C++语言实现的,用null来代替。主要加载:D:\work_soft\java\jre\lib中.jar包中的类以及虚拟机参 数-Xbootclasspath指定的类。
** 扩展类加载器:其父类加载器为启动类加载器。主要加载D:\work_soft\java\jre\lib\ext中.jar的类
** 应用类加载器:其父类加载器为扩展类加载器。主要加载应用程序路径下的类
** 自定义类加载器:其父类加载器为应用类加载器。
)
链接
何为链接,就是讲加载的类合并至Java虚拟机,使之能够执行的过程。具体流程可以分类验证,准备以及解析三个过程。
验证:验证的目的就是需要符合Java虚拟机的规范。
准备:为加载类的静态字段分配内存,部分Java虚拟机还会在这阶段构造其他跟类层次相关的数据结构,比如说用来实现虚方法的动态绑定的方法表。
解析:当class文件加载到虚拟机之前这个类不知道自己的成员变量和成员方法的地址,所以编译器会生成一个符号引用,这个符号应用包括所在类的名字,目标方法的名字,接收参数类型以及返回类型。解析就是将这个符号引用转化为实际引用。如果符号引用指向的类没有加载,那么会触发这个类进行加载,但是不会链接和初始化。
Java虚拟机规范并没有要求链接过程完成解析,如果某些字节码使用了符号引用,那么在执行这些字节码之前,需要完成解析。
初始化
初始化就是初始化静态字段,如果静态字段被final修改,那么该字段就会被标记为常量值,其初始化直接由Java虚拟机完成。其他的初始化静态字段的代码Java编译器会放在一个方法中并且命名为.
初始化就是为常量值直接赋值和执行方法的过程。Java虚拟机会通过加锁的方式确保方法只执行一次。
那么什么时候会触发初始化:
1.当虚拟机启动,初始化用户指定的类。
2.当遇到用以新建目标类实例的new指令时,初始化new指令的目标类。
3.当遇到调用静态方法的指令时,初始化该静态方法所在的类。
4.但遇到访问静态字段的指令时,初始化该静态字段所在的类。
5.子类的初始化会触发父类的初始化。
6.如果接口定义了default方法,那么直接实现或者间接实现该接口的类的初始化,会触发该接口的初始化。
7.使用反射API对某个类进行反射调用时,会初始化该类。
8.当初次调用MethodHandle实例时,初始化该MethodHandle指向的方法所在的类。
虚拟机(JVM)如何加载类的更多相关文章
- jvm中加载类的全过程
ClassLoader的作用:概括来说就是将编译后的class装载.加载到机器内存中,为了以后的程序的执行提供前提条件. jvm的整个生命周期,如下图所示 加载=>验证=>准备=>解 ...
- JVM打印加载类的详情信息
使用JVM参数即可:-XX:+TraceClassLoading
- JVM如何加载一个类的过程,双亲委派模型中有哪些方法
1.类加载过程:加载.验证.准备.解析.初始化 加载 在加载阶段,虚拟机主要完成三件事: 1.通过一个类的全限定名来获取定义此类的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法 ...
- JVM总结-虚拟机加载类
从 class 文件到内存中的类,按先后顺序需要经过加载.链接以及初始化三大步骤.其中,链接过程中同样需要验证:而内存中的类没有经过初始化,同样不能使用.那么,是否所有的 Java 类都需要经过这几步 ...
- JVM加载类的过程,双亲委派机制中的方法
JVM加载类的过程: 1)JVM中类的整个生命周期: 加载=>验证=>准备=>解析=>初始化=>使用=>卸载 1.1.加载 类的加载阶段,主要是获取定义此类的二进 ...
- Java虚拟机加载类的过程
Java虚拟机的类加载,从class文件到内存中的类,按先后顺序需要经过加载/链接/初始化三大步骤. Java语言的类型分为两大类:基本类型(primitive types)和引用类型(referen ...
- 03 Java 虚拟机是如何加载 Java 类的
Java 引用类型 Java 中的引用类型细分为四种:类,接口,数组类和泛型参数. 因为泛型参数会在编译过程中被擦除,所以 Java 虚拟机实际上只有前三种.数组类是由 Java 虚拟机直接生成的,其 ...
- 《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?
Java虚拟机是如何加载Java类的? 这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...
- JVM学习(二)JVM加载类
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
随机推荐
- 安装RabbitMQ服务器及基本配置
RabbitMQ是一个在AMQP协议标准基础上完整的,可复用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- 【2019 Multi-University Training Contest 2】
01: 02: 03: 04: 05:https://www.cnblogs.com/myx12345/p/11584100.html 06: 07: 08:https://www.cnblogs.c ...
- truncate与delete删除数据的区别
- excle里边的数据怎么导入oracle数据库
方式一:(不正式) select出的列数与已经准备好的excle中的列数相同.select xh,name from 表名 where xh = 'ghf' for update; (查不到任何结 ...
- Windows Server服务器之用户界面,任务管理器等
用户界面简化服务器管理.跟Windows 8一样,重新设计了服务器管理器,采用了Metro界面(核心模式除外).在这个Windows系统中,PowerShell已经有超过2300条命令开关(Windo ...
- BZOJ 4484: [Jsoi2015]最小表示(拓扑排序+bitset)
传送门 解题思路 \(bitset\)维护连通性,给每个点开个\(bitset\),第\(i\)位为\(1\)则表示与第\(i\)位联通.算答案时显然要枚举每条边,而枚举边的顺序需要贪心,一个点先到达 ...
- 2018-2019 ACM-ICPC Brazil Subregional Programming Contest F. Music Festival
题目:https://codeforces.com/gym/101908/problem/F 题意:给你n个舞台,每个舞台有很多个节目,每个节目有个开始时间,结束时间,价值,每个舞台至少出演过一个节目 ...
- CSS基础知识复习
1. CSS优先级 标签内部属性 style定义的CSS > 文档内定义的css > 引用外部CSS文件 2. CSS选择器类型 . 标签选择器 . 类选择器(使用.做标识) . ID选择 ...
- 在React中跨组件分发状态的三种方法
在React中跨组件分发状态的三种方法 当我问自己第一百次时,我正在研究一个典型的CRUD屏幕:"我应该将状态保留在这个组件中还是将其移动到父组件?". 如果需要对子组件的状态进行 ...
- 108、TensorFlow 类型转换
# 除了维度之外Tensorflow也有数据类型 # 请参考 tf.DataType # 一个张量只能有一个类型 # 可以使用tf.cast,将一个张量从一个数据类型转换到另一个数据类型 # 下面代码 ...