1. 从JDK源码级别彻底刨析JVM类加载机制

news2024/11/27 22:21:20

JVM性能调优

  • 1. 类加载的运行全过程
    • 1.1 加载
    • 1.2 验证
    • 1.3 准备
    • 1.4 解析

本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。

课程内容:

1、从java.exe开始讲透Java类加载运行全过程

2、从JDK源码级别剖析JVM核心类加载器

3、从JDK源码级别剖析类加载双亲委派机制

4、手写自定义类加载器打破双亲委派机制

5、Tomcat类加载机制深度剖析

6、手写Tomcat类加载器实现多版本代码共存隔离

1. 类加载的运行全过程

当我们用java命令运行某个类的main函数的启动程序时,首先需要通过类加载器把主类加载到JVM中。

public class Math {
    public static final int initData = 666;
    public static User user = new User();
 
    public int compute() { //一个方法对应一块栈帧内存区域 
        int a = 1;
        int b = 2;
        int c = (a + b) * 10;
        return c;
    }
 
    public static void main(String[] args) {
        Math math = new Math();
        math.compute();
    }
}

通过Java命令执行代码的类加载全过程

在这里插入图片描述

其中loadClass的类加载过程有以下几步:

加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载

  • 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等,在加载阶段会在内存区域生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  • 验证:校验字节码文件的准确性;
  • 准备:给类的静态变量分配内存,并赋予默认值;
  • 解析:将符号引用替换为直接引用,该阶段会把一些静态方法替换为只想数据所在内存区域的指针或句柄(直接引用),这是所谓的静态链接过程,动态链接是在程序运行过程完成的将符号引用替换为直接引用;
  • 初始化:对类的静态变量初始化为指定的值,执行静态代码块;

在这里插入图片描述

1.1 加载

在加载阶段,虚拟机需要完成以下三件事情:

  1. 通过类的全限定名来获取定义此类的二进制文件流;
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;

《Java虚拟机规范》对这三点的要求并不是特别具体,所以留给虚拟机实现与Java应用的灵活度非常大,例如我们通过一个类的全限定类名来获取定义此类的二进制字节流这条规则,它并没有指明二进制文件流必须得从某个Class文件中获取,确切的说根本没有指明说要从哪里获取,如何获取。这也是日后的JAR、WAR、EAR格式的基础。

这一阶段就是先把字节码文件丢到内存。但是加载之前要先验证一下。

1.2 验证

验证是连接的第一步,这一个阶段的目的是保证Class文件的字节流中包含的信息符合<JVM虚拟机规范>的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。验证阶段大致上会完成下面四个阶段的校验动作:

  1. 文件格式验证:这个阶段要验证字节流文件是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理。例如:是否以魔数0xCAFEBABE开头,主次版本是否在当前Java虚拟机的接受范围之内等;
  2. 元数据验证:这个阶段主要是对字节码描述的信息进行语义分析,以确保其描述信息符合<Java语言规范>的要求,例如:这个类是否有父类,这个类是否继承了不允许继承的类(被final修饰的类)等;
  3. 字节码验证:这个阶段验证过程是最复杂的一个过程,主要目的是通过数据流分析和控制流分析,确定程序语义是合法的、符合逻辑的。在第二个阶段对元数据信息中的数据类型校验分析完毕后,这阶段就要对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的行为。
  4. 符号引用验证:最后一个阶段校验行为发生在虚拟机将符号引用转换为直接引用的时候,这个转化动作在链接阶段的第三阶段-解析阶段中发生。符号引用验证可以看作是对类自身以外的各类信息进行匹配校验,通俗来说就是,该类是否缺少或被禁止访问它依赖的某些类、方法、字段等资源。

在这里插入图片描述

在这里插入图片描述

1.3 准备

准备之前要先验证各种格式等是否正确。准备就是把静态变量初始值赋值。这个赋值与最终值没有关系,比如Boolean就会赋值false,int就先赋值为0这种。

在这里插入图片描述

1.4 解析

解析阶段是将Java虚拟机将常量池内的符号引用替换直接引用的过程。

  • 符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义地定位到目标即可。
  • 直接引用:直接引用是可以直接指向目标的指针、相对偏移量或者是一个能简介定位到目标的句柄。

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

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

相关文章

【地铁上的面试题】--基础部分--数据结构与算法--数组和链表

零、章节简介 《数据结构与算法》是《地铁上的面试题》专栏的第一章&#xff0c;重点介绍了技术面试中不可或缺的数据结构和算法知识。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的步骤和规则。 这一章的内容涵盖了常见的数据结构和算法&#xff0c;包括数组…

DevOps工作级开发者认证——软件发展

. 本文先从软件产业的现状、发展趋势及挑战&#xff0c;说明敏捷和DevOps必将成为业界主流的研发模式。接着介绍和阐述了敏捷和DevOps的关系&#xff0c;相关理念、价值和主要工程方法。最后重点介绍了某著名公司端到端DevOps的实施框架及其主要内容。 本文的目的&#…

javascript基础八:JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个…

15_Linux工程目录与顶层Makefile

目录 Linux 工程目录分析 顶层Makefile详解 make xxx_defconfig过程 Makefile.build脚本分析 make过程 built-in.o文件编译生成过程 make zImage过程 Linux 工程目录分析 将正点原子提供的Linux源码进行解压,解压完成以后的目录如图所示: 图就是正点原子提供的未编译的…

【数据分类】GRNN数据分类 广义回归神经网络数据分类【Matlab代码#30】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 数据分类问题2. 广义回归神经网络&#xff08;GRNN&#xff09;3. 基于GRNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章…

八大排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(下)

目录 前言冒泡排序&#xff08;Bubble Sort&#xff09;一、概念二、实现思路三、图示过程四、案例分析1、图示过程2、第一趟排序示例 五、代码1、代码示例2、代码解释3、运行结果 六、复杂度 快速排序&#xff08;QuickSort&#xff09;一、概念二、实现思路三、图示过程四、代…

【C++学习第十二讲】C++ 常量

文章目录 一、前言二、整数常量三、浮点常量四、布尔常量五、字符常量六、字符串常量七、定义常量7.1 #define 预处理器7.2 const 关键字 一、前言 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&a…

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光,艰难的生活里,诗歌是那陡峭的另一面

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光&#xff0c;艰难的生活里&#xff0c;诗歌是那陡峭的另一面 《赶时间的人》 作者王计兵&#xff0c;一个外卖员的诗&#xff0c;饱含对生活的热情&#xff0c;向上的力量&#xff0c;仿若身在炼狱&#xff0c;心…

【014】C++数组之一维字符数组和二维字符数组

C数组之一维字符数组和二维字符数组 引言一、一维字符数组1.1、一维字符数组的初始化1.2、字符数组的遍历1.3、从键盘获取字符串1.4、使用示例 二、二维字符数组2.1、定义2.2、初始化2.3、访问 总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&…

KVM虚拟化技术学习-基础入门

1.虚拟化技术概述 虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM ⼤型机系统&#xff0c;在70年代的 System 370 系列中逐渐流⾏起来&#xff0c;这些机器通过⼀种叫虚拟机监控器[Virtual Machine Monitor&#xff0c;VMM]的程序 在物理硬件之上⽣成许多可以运⾏…

Windows下Pycharm2022如何使用Centos7中的虚拟环境 venv 实现文件实时同步

前期准备 Windows 与 Centos 怎么搞共享文件夹&#xff0c;之前写了一篇&#xff0c;这里直接引用 hyperf 关于配置yasd调试器进行远程调试 swoole sdebug调试 windowlinux 共享文件夹开发汇总_森叶的博客-CSDN博客yasd github下载链接&#xff1a;https://github.com/swoole…

redis优化

一)优雅的key结构: redis中的key虽然可以自定义&#xff0c;但是最好遵循下面的几个最佳实践约定: 1)遵循基本格式:业务名称:数据名字:ID&#xff1b; 2)长度不要超过44字节&#xff0c;key所占的字节数越小&#xff0c;占用空间越小&#xff0c;越短越好&#xff1b; 3)不要包…

this 内存原理

&#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &#x1f49f;好记性不如烂键盘&#xff0c;自己总结不如收藏别人&#xff01; &#x1f…

Spring Cloud Alibaba - Nacos

目录 一、Spring Cloud Alibaba 1、简介 二、Nacos 1、Nacos介绍 2、什么是Nacos&#xff1f; 3、为何使用Nacos&#xff1f; 4、Nacos下载和安装 4.1、启动 Linux/Unix/Mac Windows 5、Nacos代替Eureka 6、Nacos服务注册中心 一、Spring Cloud Alibaba Spring Cl…

【循环自相关和循环谱系列7】OFDM循环自相关推导分析、时间参数估计原理仿真及某无人机实际图传信号验证(含矩形/非矩形、有无循环前缀等情况)

重要声明:为防止爬虫和盗版贩卖,文章中的核心代码可凭【CSDN订阅截图或公z号付费截图】私信免费领取,一律不认其他渠道付费截图! 说明:本博客含大量公式推导分析,比较烧脑,需要有一定的数学基础,高等数学、信号与系统等! 这是循环自相关和循环谱系列的第七篇文章了…

基于SpringBoot+Vue测试用例管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着信息技术的不断发…

【Vue】学习笔记-Vue中的Ajax配置代理

回顾 常用的发送Ajax请求的方法有哪些&#xff1f; xhr​​ new XMLHttpRequest() xhr.open()、xhr.send()(真正开发中很少用到&#xff0c;太麻烦了&#xff0c;我们一般使用的都是他的二次封装) ​jQuery​​ 其对xhr有二次封装 . g e t ( ) 、 .get()、 .get()、.post ​…

【一起啃书】《机器学习》第八章集成学习

文章目录 第八章 集成学习8.1 个体与集成8.2 Boosting8.3 Bagging与随机森林8.4 结合策略8.5 多样性 第八章 集成学习 8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统、基于委员会的学习等&#xff0c;下面是集成学习的…

Mac下好用的日记、电子书阅读器、RSS订阅软件​

Mac下好用的日记笔记本、电子书阅读器和RSS订阅、播客订阅等软件推荐。我们收录到 Mac下好用的日记、电子书阅读器、RSS订阅软件​http://www.webhub123.com/#/home/detail?pLZPL-2ofIu 收录效果如下 ​也可以使用分组视图来查看各类软件网址 ​ 登录后可一键保存全部软件网址…

Java 集合 - Queue 接口

文章目录 1.Queue 接口2.LinkedList3.ArrayDeque4.PriorityQueue5.总结 队列是一种特殊的线性数据结构&#xff0c;在数据的尾部插入元素&#xff0c;在数据的头部删除元素。通常以 FIFO&#xff08;先进先出&#xff09;的方式存储和访问数据。Java 中提供了 Queue 接口来实现…