类加载器子系统

类加载器的作用是加载class文件到内存

加载阶段->链接阶段->初始化阶段

  • ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断

  • 加载的类信息存放在方法区的一个区域,该区域称为常量池,还存放了字符串字面量、数字常量等

类加载过程

判断类是否加载,已经加载了就开始链接

加载阶段

过程

​(1)通过全限类名找到类.class文件,获取文件的字节流

​(2)将字节流按照静态类的数据格式转换成存储在方法区的运行时数据结构

​(3)为该类生成唯一的java.lang.Class的对象,并在堆中分配内存,作为方法调用和属性的接口

找到.class文件->获取字节流->转换成运行时数据结构->内存中生成Class对象

class文件的不同加载方式

​ (1)从本地文件系统加载

​ (2)网络加载

​ (3)压缩包加载,比如jar包、war包

​ (4)运行时计算生成,动态代理模式下常用

​ (5)其他文件生成,比如jsp文件

​ (6)数据库提取

​ (7)加密文件中获取,比如防反编译的class文件

链接过程

验证(Verify)(检查字节码文件规范)

​ 验证字节流是否符合java虚拟机规范,符合规范就继续链接过程,否则抛出异常

准备(prepare(初始化类变量:分配内存、赋初值为0|null)

​ 为类变量分配内存空间,并赋初值0值(null值)

​ 注意:准备过程只为静态变量赋初值,不会为常量赋初值,因为常量在编译阶段就已经完成了赋值

解析(Resolve)(解析引用)

​ 将符号引用解析成直接引用

符号引用: 用符号来描述引用的目标

直接引用: 直接指向目标的指针、偏移量

初始化过程

初始化

​ 执行构造器方法 cinit

构造器方法

​ javac编译时会将类的静态变量赋值语句静态代码块合并成一个构造器方法

​ (1)构造器方法的指令执行顺序与java代码的语句顺序一致

​ (2)JVM会保证父类的构造器方法在子类构造器方法之前完成执行

​ (3)构造器方法只执行静态代码块语句和类变量的赋值,如果源代码中无这两者就不会生成构造器方法

​ (4)JVM会为构造器方法加线程同步锁,保证每个类只加载一次

例子

private static int num = 1;
static{
num = 2;
number = 20;
}
private static int number=10;

上述特殊情况:number的声明在符值后面,但是jvm依然能初始化,因为在构造器方法之前已经完成了链接阶段的prepare过程,该过程为number符值了0

过程: linking.prepare:number=0->init:number=20, number=10

init阶段的符值是严格按照代码顺序的

jvm学习笔记:类加载过程的更多相关文章

  1. JVM学习笔记——类加载过程

    JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...

  2. [jvm学习笔记]-类加载过程

    JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流 ...

  3. JVM学习笔记——类加载和字节码技术篇

    JVM学习笔记--类加载和字节码技术篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分 我们会分为以下几部分进行介绍: 类文件结构 字节码指令 编译期处理 类 ...

  4. JVM学习笔记——类加载器与类加载过程

    类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...

  5. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  6. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  7. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  8. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  9. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  10. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...

随机推荐

  1. Python 机器学习实战 —— 无监督学习(下)

    前言 在上篇< Python 机器学习实战 -- 无监督学习(上)>介绍了数据集变换中最常见的 PCA 主成分分析.NMF 非负矩阵分解等无监督模型,举例说明使用使用非监督模型对多维度特征 ...

  2. bugku-misc 9-16

    宽带信息泄露 拿到一个bin后缀的文件,知道是一个二进制文件,但是题目提到的和宽带有关,flag就是用户名.可以使用RoutePassView这个工具,使用的时候记得关闭杀毒软件. 工具可以在这里下载 ...

  3. SpringBoot-技术专区-用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)

    前提概要 在特别特殊的时候,我们可能需要外置tomcat去运行程序,例如alitomcat等特殊场景,方便我们去定时化开发项目或者其他特殊场景. 外置tomcat执行 pom.xml文件首先更改打包方 ...

  4. Haskell Command-line Application Building

    Haskeline Package Haskeline provides a user interface for line input in command-line programs. This ...

  5. 用Python爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话

    大家好,我是辰哥~ 今天辰哥带大家分析一波当前热门手游<王者荣耀>英雄皮肤,比如皮肤上线时间.皮肤类型(勇者:史诗:传说等).价格. 1.获取数据 数据来源于<王者荣耀官方网站> ...

  6. 零基础学Java之Java学习笔记(二):Java快速入门

    提出要求: 开发一个 HelloWorld.java 程序,可以输出 "Hello,world!" 开发步骤: (1)将 Java 代码编写到扩展名为 HelloWorld.jav ...

  7. SQL injection:Summary ,Overview and Classification

    What is SQL injection (SQLi)? SQL注入是一种web安全漏洞,让攻击者干扰应用程序对其数据库的查询. 它通常使得攻击者查看他们通常无法检索的数据. 这可能包括属于其他用户 ...

  8. 徒手打造基于Spark的数据工厂(Data Factory):从设计到实现

    在大数据处理和人工智能时代,数据工厂(Data Factory)无疑是一个非常重要的大数据处理平台.市面上也有成熟的相关产品,比如Azure Data Factory,不仅功能强大,而且依托微软的云计 ...

  9. [转]C# 互操作性入门系列(一):C#中互操作性介绍

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  10. C#基础知识---装箱与拆箱

    一.定义 装箱:将值类型转化为引用类型,装箱一般会在堆上分配一块内存,用于存储要转换的值. 拆箱:将引用类型转化为值类型 注:.NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问 ...