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,一经查实,立即删除!

相关文章

pkpm板按弹性计算还是塑性_[转载]双向板按弹性还是按塑性方法计算

双向板按弹性方法还是按塑性方法计算茅老师您好!想请教您个问题,PKPM计算双向板时一般都是按弹性算吧,可我去年刚进设计院的时候有一个项目是按塑性算的,这样影响大不大啊,支座与跨中弯矩比值系数取得默认的1.8&#x…

Java 的混合执行模式

导航解释执行与编译执行总结解释执行与编译执行 Java 虽然是先编译再运行,但实际上,对于 JVM 来说,依然是逐条解释执行字节码文件中的指令,即大部分情况下,Java 都是解释执行的。 JVM通过 interpreter 解释器解释执行…

下载 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万像素分辨率…

friendly发音_friendly是什么意思_friendly怎么读_friendly翻译_用法_发音_词组_同反义词_友好的_亲密的-新东方在线英语词典...

词汇搭配用作形容词 (adj.)~名词friendly co-operation友好合作~介词friendly to对…友好,有利于…friendly to a cause支持〔有利于〕某事业friendly towards sb对某人友好friendly with sb与某人亲热词组短语environmentally friendly保护生态环境的&a…

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

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

不安装cudnn可不可以_关于CUDA和cuDNN的安装

不得不说,安装显卡驱动和CUDA、cuDNN是深度学习工作者的必备技能。CUDA(Compute Unified Device Architecture),是NVIDIA推出的运算平台。cuDNN 专门针对Deep Learning框架设计的一套GPU计算加速方案。虽然安装这不是学习的目的,但却是很多人…

常用自定义注解

导航一、方法计时器二、valid 参数校验的通用返回三、接口访问频次拦截(幂等)一、方法计时器 注解类:MethodTimer Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MethodTimer { }处理器(需…

python 系统架构_Python之优化系统架构的方案

方案3: 改变系统架构在开始多进程之前,先简单说明一下python GIL, 之前自己对他也有些误解。因为python GIL的机制存在,同时运行的线程只有一个,但这个线程在不同时刻可以运行在不同的核上,这个调度是由操作系统完成的…

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

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

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

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

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

ios 图片逆时针旋转_iphone-IOS 竖直拍照被旋转,image-orientation 让图片自动旋转

本文目录结构IOS 垂直拍照的时候会遇到,PC 端读取的时候,逆时针旋转了 90 度的问题;安卓、PS 处理的,相册选择截图等不会出现这个问题;场景说明:这个图片在浏览器里,如果您单独打开的时候&#…

Spring Cloud Alibaba —— Sentinel 入门

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

websocket 获取连接id_websocket建立连接时能传递参数吗

展开全部您可以这样!在js传参的时候参数就和其他地址一样传就行 比如var wsUrl ws://localhost:8080/ScadaWebSocket/ScadaSocket/我的参数webSocketnew WebSocket(wsUrl);后台的类上面的注解这样写ServerEndpoint(value "/ScadaSocket/{param}")注意上面的花3231…