快看小说网这篇我们说说虚拟机是如何加载这些Class文件的?Class文件中的信息进入到虚拟机后会发生什么变化?这就涉及到了类加载机制。
类加载机制是把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。这一系列的过程都是在程序运行期间完成的。

类加载器

类加载器就是下图中红框的部分,它通过一个类的全限定名来获取描述此类的二进制字节流,从而将java类动态地加载进JVM的内存空间中。

适用情景

我和女神在荒岛的日子陆远对于一个非数组类的加载阶段,可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成。
对于数组类而言,其由java虚拟机直接创建,不通过类加载器。

双亲委派机制

双亲委派机制是类加载所采取的一种方式。如果一个类加载器收到了类加载的请求,你是我的两小无猜它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一层的类加载器均是如此。只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。


类比到现实:小明想买一个玩具挖土机,可他又不好意思直接张口说。所以,发生了下面的对话。

小明去问他爸爸:爸爸你有挖土机吗?
爸爸说:没有哎
接着爸爸问爷爷:爸爸爸爸,你有挖土机吗?
爷爷说:没有哎
接着爷爷问太爷爷:爸爸爸爸,你有挖土机吗?
太爷爷说:我也没有。让重孙子去买一个吧。
结果小明就高高兴兴地自己去买了一个玩具挖土机。

问题来了:如果至尊战神萧尘爷爷有一台挖土机怎么办?那小明就只能玩爷爷那个,不能自己再去买了。类比到类加载机制里,就是如果某个父类能对此类进行加载,那应用程序类或自定义这些子类就不用自己加载了。

分类
启动类加载器是使用C++实现的,是虚拟机自身的一部分。契约宠婚甜如蜜
其它类加载器是由java语言实现的,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。

好处
以String类为例。就算是用户自己写了一个String类的实现,那对此类进行加载时,也只会委派给启动类加载器来对JDK中原本的String类进行加载,而自定义的String类永远不会被调用。这样保证了系统的安全。

什么时候进行类加载?

我真是大富豪赵权有且只有以下5种方式必须立即对类进行加载
(1)使用new实例化对象的时候;读取或配置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候;调用一个类的静态方法的时候。
(2)使用java.lang.reflect包的方法对类进行反射调用的时候。如果类没有进行过初始化,则需要先触发其初始化。
(3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的类),虚拟机会先初始化这个主类

类加载过程详述

类加载过程分为5步。大部分都是魅姬惑天下由虚拟机主导和控制的,除了以下两种情形:

  • 在加载阶段

开发人员可以通过自定义类加载器参与

  • 在初始化阶段

会执行开发人员的代码去初始化类变量和其它资源

1、加载

顾廷深霍念念虚拟机需要完成的事情:
(1) 通过一个类的全限定名来获取定义此类的二进制字节流。
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

2、验证

验证的目的是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全。
其分为4个步骤:文件格式验证,元数据验证,字节码验证,符号引用验证。医妃权倾天下林初九其中文件格式验证是直接对字节流进行操作的,其余3项是在方法区中进行的。

3、准备

此阶段是正式为类变量分配内存并设置类变量初始值的阶段。其是在方法区中进行分配的。有两个注意点:
(1)此时只是对类变量(被static修饰的变量)进行内存分配,而不是对象变量。给对象分配内存是在对象实例化时,随着对象一起分配到java堆中。
(2)如果一个类变量没有被final修饰,则其初始值是数据类型的零值。比如int类型的是0,boolean类型的是false。举个例子来说明:

1 public static int value=123;

在我是一具尸体准备阶段过后的初始值为0而不是123,因为这个时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器< clinit >()方法之中。所以把value赋值为123的动作将在初始化阶段才会执行。

public static final int value=123;

  

此时因为有final,所以在准备阶段value就已经被赋值为123了。

4、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。可对类或接口、字段、类方法、接口方法等进行解析。

符号引用是什么
符号引用就是包含类的信息,方法名,方法参数等信息的字符串,它供实际使用时在该类的方法表中找到对应的方法。

直接引用是什么
直接引用至尊人生就是偏移量,通过偏移量可以直接在该类的内存区域中找到方法字节码的起始位置。
符号引用是告诉你此方法的一些特征,你需要通过这些特征去寻找对应的方法。直接引用就是直接告诉你此方法在哪。

5、初始化

此阶段用于初始化类变量和其它资源,是执行类构造器< clinit >()方法的过程,此时才是真正开始执行类中定义的java程序代码。

写累累,看会书去www.kuaikanxs.cc

转载于:https://www.cnblogs.com/Katerina/p/11382798.html

JVM(4)—类加载机制相关推荐

  1. 「JVM 系列」- JVM的类加载机制

    前言 在类的生命周期中,第一个阶段是就是类的加载阶段,在这个阶段,非数组类的二进制字节流被加载进内存中,并生成一个java.lang.Class对象. 本文主要论述发生在这一阶段的故事. 一. 类加载 ...

  2. 怎么加载文件_Java虚拟机从入门到入土之JVM的类加载机制

    作者:六脉神剑 转载于:https://juejin.im/post/5e1aaf626fb9a0301d11ac8e JVM总体概述 JVM总体上是由 类装载子系统(ClassLoader) 运行时 ...

  3. 【原创】JVM 的类加载机制?盘它!

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 12 分钟. 我们编写的代码存储在java文件中,java源代码通过编译生成Java虚拟机可识别的字节码,存储在Class文件 ...

  4. [JVM]虚拟机类加载机制

    目录 概述 加载 连接阶段 验证 准备 解析 初始化 类加载器 双亲委派模型 类加载器种类 什么是双亲委派模型 双亲委派机制的优点? 双亲委派模型的实现 破环双亲委派模型 类加载及执行子系统 Tomc ...

  5. JVM之类加载机制(基于《深入理解Java虚拟机》之第七章类加载机制)(上)

    asd在前两篇文章中,我们总结了Class文件结构以及相应的字节码指令,它让我们明白了Class文件存储格式的具体细节,接下来我们就要学习JVM如何加载Class文件. dsadClass文件应当是一 ...

  6. JVM Class 类加载机制(系列号3)

    类加载的过程 加载是类加载的一个阶段:虚拟机在运行时把描述类的信息的class文件数据加载进入内存,并对数据进行验证,准备,解析,初始化,使用与卸载七个阶段. 其中验证,准备,解析,三个阶段合起来称作 ...

  7. Java 工程师必须掌握的 JVM 类加载机制!

    这篇文章不聊别的,专门来侃侃JVM的类加载机制 概念 类加载器把class文件中的二进制数据读入到内存中,存放在方法区,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据 ...

  8. jvm类加载机制_面试:对于JVM类加载机制深度解析

    目录: 前文回顾 JVM在什么情况下会加载一个类? 从实用角度出发,来看看验证.准备和初始化的过程 核心阶段:初始化 类加载器和双亲委派机制 1.前文回顾 咱们今天先来回顾一下昨天讲到的JVM整体的一 ...

  9. JVM 类加载机制:编译器常量与初始化

    1. 前言 最近在研究JVM虚拟机类加载机制的时候,我们了解到了类加载机制的生命周期以及在准备阶段,JVM虚拟机会对类的静态变量进行初始化,这个时候只是会将静态变量初始化为默认的初始值.对静态变量的定 ...

  10. 深入理解JVM(5)——虚拟机类加载机制

    在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...

最新文章

  1. RadGrid使用技巧:从RadGrid获取绑定的值
  2. javascript调用父窗口(父页面)的方法
  3. 创建第二个 local network - 每天5分钟玩转 OpenStack(84)
  4. linux文件系统挂载磁盘,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)
  5. Spring中@Async用法总结
  6. 想上云,请评估与思考上云目的
  7. android长按加入购物车,《Android APP可能有的东西》之UI篇:加入购物车动画
  8. 字节跳动研发的云固件投入应用 首批装机200余台X86服务器
  9. jbpm知识点——state
  10. Windows 编程[11] - WM_SIZE 消息
  11. 华为2019 秋招笔试题
  12. iface eth0 inet dhcp
  13. 图扑国风设计 3D 可视化 | 科技与文化碰撞炫酷”火花“
  14. PXE网络安装linux系统
  15. python安装pytorch
  16. 3种方法教你PS快速去掉水印
  17. Unity中常用的游戏存档/读档技术
  18. 自己的联想Y450笔记本无法连接无线网络的解决办法
  19. vim 无法使用backspace 删除键进行删除
  20. 如何设置幻灯片自动播放

热门文章

  1. Android长截图与长图分享
  2. 《分解因数》:质因数分解
  3. 【微信小程序】图片选择、转码、压缩、预览、上传,file与base64
  4. 后台管理系统中的antd vue中的问题(动态加载列表a-select-option,后台管理中a-selct-option的回显)
  5. 什么是obj文件?obj文件详解
  6. 信息安全-期末复习题
  7. WXpython下载很慢安装包教程,直接安装不上,只好把所有包下载下来
  8. android程序设计报告 尤志宁,尤志宁 - 集美大学 - 计算机工程学院
  9. 国产分布式数据库在证券行业的应用及实践
  10. 当电竞选手成为一种职业,游戏手机是否也会炙手可热?