JVM——详解类加载过程

导航

  • 一、过程概述
  • 二、Loading
    • 2.1 类加载器
    • 2.2 双亲委派机制
    • 2.3 类在内存中的结构
  • 三、Linking
  • 四、Initializing

一、过程概述

java 源文件编译后会生成一个 .class文件存储在硬盘上。

在程序运行时,会将用到的类文件加载到 JVM 内存中。从磁盘到内存的过程总共分为三个步骤:加载、连接、初始化。

  1. Loading
  2. Linking
  3. Initializing

二、Loading

Loading 过程是把一个 class 文件加载到内存中去。

2.1 类加载器

JVM 加载类的方式是按需动态加载,采用双亲委派机制

认识几种系统提供的类加载器:

  1. Bootstrap 启动类加载器,负责加载指定目录——JAVA_HOME/lib下的 rt.jar、charset.jar 等核心类库,由 C++实现,是JVM 的不可分割的一部分。类加载范围可以在 Launcher 类中查看:
    在这里插入图片描述

  2. ExtClassLoader 扩展类加载器,负责加载指定目录——JAVA_HOME/lib/ext 下的扩展包,或者也可以由 -Djava.ext.dirs 参数指定。类加载范围可以在 Launcher 类中查看:
    在这里插入图片描述

  3. AppClassLoader 应用类加载器,加载用户应用的 classpath 下的 class 文件,这是应用程序的默认类加载器,用户自定义的类都是通过这个类加载器来加载。类加载范围可以在 Launcher 中查看:
    在这里插入图片描述

  4. 自定义类加载器,开发者自定义的 ClassLoader,继承自 ClassLoader 抽象类,并重写 findClass(…) 。

类加载器(除 C++实现的 Bootstrap 外)本身就是一个普通的 class,JVM 所有的 class 都是被类加载器加载到内存的。

public class TestLoadClass {public static void main(String[] args) {System.out.println(TestLoadClass.class.getClassLoader());System.out.println(TestLoadClass.class.getClassLoader().getParent());// Bootstrap 由 C++ 实现,Java 中没有具体的类与之对应,故返回 nullSystem.out.println(TestLoadClass.class.getClassLoader().getParent().getParent());}
}
output:
sun.misc.Launcher$AppClassLoader@58644d46
sun.misc.Launcher$ExtClassLoader@4554617c
null

2.2 双亲委派机制

JVM 加载类时处于安全考虑,基础类和扩展类等,都必须由指定的类加载器来加载,不同的类加载器有自己的命名空间,同一个类,如果由不同的类加载器加载,会在内存中存在多份类对象。也正因如此,JVM 的类加载机制要求诸如 java.lang.Object 这种基础类必须由最基础的 Bootstrap 来加载。

因此,整个 Loading 的过程就成了:底层类加载器收到类加载请求后,必须将请求层层传递给父级加载器检查,确认是否应该由父级加载器加载,若由于父加载器的指定类路径中没有该类文件,就会再层层向下返回,最终才会去加载:
双亲委派机制流程

Tip:注意,AppClassLoader 的父加载器是 ExtClassLoader,ExtClassLoader的父加载器是Bootstrap 加载器。
这里的父加载器并不是 Java 多态中语法的 extends 继承关系,而是一种架构上的层级关系,AppClassLoader 和 ExtClassLoader 之间没有任何继承关系,它们在语法上,都继承自 ClassLoader 抽象类,实际上 ClassLoader 中维护了一个 ClassLoader parent 引用,这才是 “双亲” 的真实面目,即 AppClassLoader 的父加载器实际上是其内部的一个组合对象

2.3 类在内存中的结构

加载的时候,创建了两块内容,第一块内容是把 Xxx.class 二进制扔到内存中,第二块内容是生成一个 Class 类的对象,该对象中的变量会指向前一块的实际内存地址(这一步实际上是Resolution 的过程)。

三、Linking

Linking,连接,这是一个大的步骤,其中又分为三个小步骤:

  1. Verification 验证
  2. Preparation 准备
  3. Resolution 解析

验证:校验 class 文件格式是否符合 jvm 规范,如开头的魔数等。
准备:将 class 中的静态变量赋默认值,所谓默认值,举个例子,int 类型默认值是 0,String 类型默认值是 null。
解析:把class 文件常量池中的符号引用转化为直接内存地址

四、Initializing

初始化,区别于 Linking 中的 Preparation ,此过程将静态变量赋初始值。比如:

public static int num = 8;

这个 num 静态变量会在 Preparation 阶段赋值 0 ,在 Initializing 阶段赋值 8。

Java初始化的时机,JVM规范中有明确规定,自然,加载也一定是在初始化之前完成。JVM规范中定义了以下这些必须初始化完毕的场景:

  1. new
  2. 读取和设置 static 变量,只触发直属类的初始化(例如,子类直接引用父类中的 static 变量,只初始化父类)
  3. 调用 static 方法
  4. 子类初始化之前,父类必须完成初始化
  5. main 函数所在的类在执行之前必须完成初始化
  6. 通过反射获取类信息

注意:对于 static final 类型的属性,在编译之后即存储在字节码文件的常量池中,直接引用它不会触发初始化。

记忆技巧:

  1. new 是创建对象,而对象的创建一定需要类信息的支持
  2. static 变量和方法,又称为类变量、类方法,它们都需要类指针来访问。
  3. main也属于static 方法
  4. 子类是父类的扩展,子类都要初始化了,父类当然一定要先初始化
  5. 反射是使用类信息的一种技术,当然需要先初始化类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载 Java 学习的权威文档

JVMS 和 JLS 文档的下载 快速直达: https://docs.oracle.com/javase/8/ --> Java Language and Virtual Machine Specifications jvm specification 和 java language specification 是Java 学习的两个最权威的文档。如果你用的是 Java 8,就可以去下载…

iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机

出自蜂鸟网-器材频道,原文链接:https://m.fengniao.com/document/5358989.html徕卡于今日正式发布SL2相机,搭载4700万像素CMOS感光元件、通过感光元件移位实现光学图像稳定的五轴防抖技术、全新徕卡物距探测式自动对焦技术以及576万像素分辨率…

JVM——对象的创建与内存布局

导航一、对象的创建过程二、对象的内存布局2.1 内存布局2.2 计算对象的内存大小三、对象的定位3.1 句柄池3.2 直接指针四、对象的分配过程一、对象的创建过程 对象,又叫实例,是 OOP 的最常用角色。 如何创建一个对象?一般都是使用 new 关键…

JVM垃圾收集器——G1

导航引言一、G1 介绍1.1 适用场景1.2 设计初衷1.3 关注焦点1.4 工作模式1.5 堆的逻辑结构1.6 主要收集目标1.7 停顿预测模型1.8 拷贝和压缩1.9 与 CMS 和 Parallel 收集器的比较1.10 固定停顿目标二、堆的逻辑分区2.1 region2.2 CSet2.3 RSet2.4 Card Table三、G1 的工作原理3.…

的mvc_简述PHP网站开发的MVC模式

为了提高开发时候的代码重用和开发速度,php使用了mvc的模式,主要是对代码的功能进行了分类,M:model主要是对数据库进行操作,v:view主要是前端html文件操作,c:controller主要是编写基…

CAP 原则与 BASE 理论

导航引言一、CAP 原则1.1 Consistency 一致性1.2 Available 可用性1.3 Partition tolerance 分区容错性1.4 CAP 的矛盾1.5 CAP 的组合场景二、BASE 理论2.1 基本可用2.2 软状态2.3 最终一致性2.3.1 因果一致性2.3.2 读自身所写2.3.3 会话一致性2.3.4 单调读一致性2.3.5 单调写一…

java 教室借用管理系统_[内附完整源码和文档] 基于JAVA语言的学生选课信息管理系统...

摘 要本系统运用Java面向对象的方法设计而成。近年来,学生选课系统越来越在高校学生群体中得到普及,其所承担的功能也变得越来越丰富,所起到的作用也变得越来越重要,在被学校学生重视的同时,也意味着它的功能要更加完善…

jMeter 模拟 web 高并发请求

导航一、jmeter 简介与下载二、接口压测设置三、实战演示一、jmeter 简介与下载 Apache JMeter是Apache组织开发的基于Java的压力测试工具。 最初被设计用于Web应用测试,但后来扩展到其他测试领域。JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c…

实施文档_建设工程监理全套资料范本,Word文档附百份案例表格,超实用

建设工程监理全套资料范本,Word文档附百份案例表格,超实用在日常工作中,监理人员不仅需要经常跑腿儿检查,同时还需要提交许许多多的资料存档,甚至可能需要熬夜码字。今天整理的监理资料范本,既能让监理人员…

微服务架构 —— 服务雪崩与容错方案

导航一、什么是服务雪崩二、雪崩效应的三个核心原因三、容错四、业界常见容错思路五、常见容错组件一、什么是服务雪崩 服务雪崩 指的是微服务架构中,微服务各节点之间由于网络通信异常或微服务自身故障等问题,导致请求堆积、任务堆积,消耗和…

手游方舟怎么输入代码_明日方舟再次登顶失败,为了不发十连奖励,鹰角实力控分?...

在明日方舟新版本活动“孤岛风云”正式上线后,关于干员的强度和游戏剧情的讨论也在最近多了起来。尤其是在一周年卫星干员山落地,并且人气干员塞雷娅背后的故事揭晓之后,明日方舟的热度也在玩家圈子中迅速的攀升,成为近期话题量十…

Spring Cloud Alibaba —— Sentinel 入门

导航一、什么是Sentinel1.1 Sentinel 的优点二、整合 Sentinel 演示三、Sentinel控制台与微服务通信的原理四、Sentinel 流控演示一、什么是Sentinel Sentinel 是阿里开源的用于提供微服务架构容错方案的组件。它以流量作为切入点,从流量控制、熔断降级、系统负载保…

Spring Cloud Alibaba —— Sentinel 详细使用

导航引言一、Sentinel的两个基本概念二、流控规则2.1 基本选项2.2 高级选项三、熔断(降级)规则四、热点规则五、授权规则(了解)六、系统规则(了解)七、自定义异常返回八、SentinelResource九、Sentinel 规则持久化(待补…

扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君

小米在2016年首次推出了扫地机器人,凭借产品力和性价比,可以说为中国家庭的智能清洁概念普及,立下一功。不过,近两年因为一直没有推出扫拖一体产品,急得民间高手都开始自己动手给米家扫地机改造拖地功能了,…

Spring Cloud —— Gateway 服务网关

导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、G…

图形显卡_选核芯显卡还是独立显卡?这才是决定笔记本电脑性能的关键

买笔记本电脑的时候,选核芯显卡还是独立显卡是很多朋友纠结的问题。核芯显卡是建立在和处理器同一内核芯片上的图形处理单元,而独立显卡拥有单独的图形核心和独立的显存。那么具体哪个更好呢?这里就来介绍一下。两者各自的特点核芯显卡和传统…

Spring Cloud —— 链路追踪技术

导航一、什么是链路追踪二、Spring Cloud Sleuth2.1 相关概念三、Sleuth 入门案例四、Zipkin 的集成4.1 Zipkin 介绍4.2 Zipkin 服务端安装4.3 Zipkin 客户端安装五、Zipkin 数据持久化5.1 MySQL 数据持久化5.2 Elasticsearch 数据持久化一、什么是链路追踪 在大型系统的微服务…

bool类型数组转换成一个整数_「PHP」常用的数组键值操作函数,面试重点

数组键值操作函数1、array_values ( array $array ) : array返回数组中所有的值的数组$a[name>jikeshiguangji,age>26];print_r(array_values($a));运行结果:$aarray("name">"jikeshiguangji","age">"26");pri…

Spring Cloud —— 消息队列与 RocketMQ

导航一、什么是 MQ二、常见的 MQ 产品三、RocketMQ 概念与架构设计3.1 基本概念1、消息模型(Message Model)2、生产者与消费者(Producer & Consumer)3、主题(Topic)4、代理服务器与名称服务&#xff08…

惠普打印机只打印一半_惠普打印机如何安装 惠普打印机加墨方法【介绍】

对于多数上班族和学生党来说,平时办公和学习不仅仅离不开 电脑 ,与此同时还需要 打印机 起到辅助作用。目前市场上的打印机品牌较多,惠普就是其中知名度较高的一个牌子,拥有大批的消费群体。但是有些人在将打印机买回来之后&#…