当前位置: 首页 > news >正文

JVM——类加载与字节码技术—类加载器+运行期优化

5.类加载器

jdk的类加载器具有层级关系。

启动类加载器》扩展类加载器》应用程序类加载器》自定义类加载器

 对应类加载器只会负责加载对应目录的类。

双亲委派上级机制

应用程序类加载器加载一个类之前会先查询上级加载器是否已经加载过了该类。然后再让上级询问上上级。都没有时才轮到应用程序类加载器加载。

5.1 启动类加载器

使用启动类加载器命令行加载类。 

 启动类加载器是c++代码编写,不能直接返回。打印出时null说明是启动类加载器。

通过替换启动类加载器的类路径使用启动类加载器加载指定类。

5.2 扩展类加载器

 

在默认情况下都是应用程序类加载器。

在扩展类加载器路径下放一个同名类,扩展类加载器下的类必须是以jar包的方式存在的,所以先打包一份。

jar -cvf 包名.jar  类路径 

复制到扩展类加载器对应目录 

 再次运行测试类

 得到加载的是扩展路径下的G,说明G被扩展类加载器加载了,这里是应用程序类加载器委派了扩展类加载器来加载G

5.3 双亲委派模式

 

5.4 线程上下文类加载器

 

 原本是应该用启动类加载器完成相关联的类的加载,这里却使用了应用程序类加载器

jdk找不到对应类,所以才用了应用程序类加载器。

 按照约定设计jar,配合spi根据接口找到实现类加以实例化。达到解耦效果。

 与spring相似根据接口得到实现类的实例对象。

 线程上下文类加载器是在每个线程启动时由jvm把应用程序类加载器赋值给当前线程,将来线程对调用getContextClassLoader()可以拿到应用程序类加载器。

 所以java  manager本身是启动类加载器加载器的,但是ServiceLoader内存用的是线程上下文类加载器,也是破坏了双亲委派机制,没有用启动类加载器找mysql驱动。

5.5自定义类加载器

使用场景

定义类加载器

 测试类

 使用不同类加载器加载同一个类,两个类比较不仅要包名类名相同,还要类加载器对象相同才能确定是同一个类。

6.运行期优化

6.1即时编译

分层编译

 该例中有两层循环,外层循环对内存循环进行计时统计,内层循环会创建1000个对象

可以看见运行速度有两次明显的下降

 

 原因

即时编译发挥了作用,热点代码

当某个字节码被反复调用,会启用编译器,进行编译执行。有两种_c1和c2即时编译器。

即时编译器会将反复执行的代码编译成机器码存在codecash代码缓存中,下一次直接把编译好的机器码拿出来用。

c1做基本优化,c2做彻底优化,c1多了信息统计的工作。

 

c2编译器发现new Object()的操作未逃逸,外层不会用到,所以直接不创建了,用了别的字节码替换了这部分代码。

关闭逃逸分析再运行发现后一次下降已经没了

方法内联

 

内存循环反复调用方法,外层循环统计时间。

 

 可以看见运行时间也有两次大优化,最后到0是因为jvm认为是常量,直接不变了

通过设置参数进行内联情况打印

循环了多次之后直接打成了热点代码,进行了内联。

 禁用内联的参数

直接指定一个方法,不让其内联

 

字段优化

针对(静态)成员变量读写进行优化。

第一个注解:预热,让编译器对代码进行优化

第二个注解: 进行多少轮测试 

 三种循环方式进行累加。

dosum上的注解用于控制是否进行方法内联。

第一个是直接循环原数组累加,第二个是用别的数组变量接收原数组累加,第三个是foreach原数组累加。

看到了三个循环的得分,误差,每秒吞吐量单位

得分越高越好,现在三个得分都相差不多

 禁止方法内联之后

 允许方法内联之后会直接把doSum内的方法拷贝放到调用者位置。

第一个的:

 第二个的:

通过一次手动优化就不用每次都去class里面找,直接本地变量表回去长度和地址

在方法内联时第一个方法会由虚拟机进行优化,和第二个的效果一样。

第三个的:

转换后的代码和第二个等价,效果一样。

 第一个是运行期间优化,第二个是手动优化,第三个是编译期间优化。

就是之前test1中,编译器针对方法是否内联进行了读取方面相关的优化,首次读取,后续简化

6.2 反射优化

反射是java提供的一个重要功能,可以在运行时检查类、接口、方法和变量等信息,无需知道类的名字,方法名等。还可以在运行时实例化新对象,调用方法以及设置和获取变量值。

反射非常强大和有用,很多java框架中都有反射的影子,例如spring、mybatis等等,

JDBC利用反射将数据库的表字段映射到java对象的getter/setter方法。

Jackson, GSON, Boon等类库也是利用反射将JSON文件的属性映射到java对的象getter/setter方法。

可见,只要使用java,反射就无处不在。

上面代码中有一个静态方法,main方法内通过类对象获得了方法对象,进行了17次调用,

通过invoke执行方法对象的反射调用。前16次调用性能较低,最后一次性能较高。

 

 

 invoke方法里面通过一个方法访问器接口进去,进去第一个实现后调用了第三个实现本地方法访问器。

本地方法访问器里面有调用一个native本地方法。效率较低。

 但是这里面会记录调用次数,和一个膨胀阈值进行比较,默认是15。

 大于15次之后会把本地方法访问器替换成一个运行期间动态生成的新的方法访问器。

用该工具查看运行期间动态生产的字节码

 

在新生成的方法访问器里面的invoke里通过Reflect1类调用了foo()静态方法,已经不是反射调用了。

jvm在第17次将反射调用变成了正常的方法调用。

相关文章:

JVM——类加载与字节码技术—类加载器+运行期优化

5.类加载器 jdk的类加载器具有层级关系。 启动类加载器》扩展类加载器》应用程序类加载器》自定义类加载器 对应类加载器只会负责加载对应目录的类。 双亲委派上级机制 应用程序类加载器加载一个类之前会先查询上级加载器是否已经加载过了该类。然后再让上级询问上上级。都…...

[linux实战] 华为云耀云服务器L实例 Java、node环境配置

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…...

python面试:使用cProfile剖析程序性能

我们需要安装tuna:pip install tuna 程序执行完毕后,我们会得到一个results.prof,在CMD中输入指令:“tuna results.prof”。 import time import cProfile import pstatsdef add(x, y):resulting_sum 0resulting_sum xresulti…...

leetcode-188-买卖股票的最佳时机 IV

1. 问题描述 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/ 2. 解题代码 public class Solution {public int MaxProfit(int k, int[] prices) {if(prices.Length<2){return 0;}if(k0){return 0;}List<int> listValuenew List<…...

Grounded Language-Image Pre-training论文笔记

Title&#xff1a;Grounded Language-Image Pre-training Code 文章目录 1. 背景2. 方法&#xff08;1&#xff09;Unified Formulation传统目标检测grounding目标检测 &#xff08;2&#xff09;Language-Aware Deep Fusion&#xff08;3&#xff09;Pre-training with Scala…...

成集云 | 钉钉财务费用单同步至畅捷通 | 解决方案

源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分&#xff0c;在企业的发展和成长中扮演着重要角色&#xff0c;成集云以钉钉费用单OA审批与畅捷通TCloud系统为例&#xff0c;与钉钉连接器深度融合&#xff0c;通过数据处理和字段匹配实现了费用…...

Redis——》死锁

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

URL重定向漏洞

URL重定向漏洞 1. URL重定向1.1. 漏洞位置 2. URL重定向基础演示2.1. 查找漏洞2.1.1. 测试漏洞2.1.2. 加载完情况2.1.3. 验证漏洞2.1.4. 成功验证 2.2. 代码修改2.2.1. 用户端代码修改2.2.2. 攻击端代码修改 2.3. 利用思路2.3.1. 用户端2.3.1.1. 验证跳转 2.3.2. 攻击端2.3.2.1…...

JavaScript(函数,作用域和闭包)

目录 一&#xff0c;什么是函数1.1&#xff0c;常用系统函数1.2&#xff0c;函数声明 1.3&#xff0c;函数表达式二&#xff0c;预解析2.1&#xff0c;函数自调用 2.2&#xff0c;回调函数三&#xff0c;变量的作用域3.1&#xff0c;隐式全局变量 四&#xff0c;作用域与块级作…...

C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密

C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密&#xff0c;为了演示方便本问使用的是Visual Studio 2022 来构建代码的 1、新建项目&#xff0c;之后选择 项目 鼠标右键选择 管理NuGet程序包管理&#xff0c;输入 BouncyCastle 回车 添加BouncyCastle程序包 2、代码如下&am…...

【docker-compose】【nginx】动态配置

需求&#xff1a;部署前端镜像时需要动态修改nginx反向代理的后端服务的ip地址 原.conf配置调整&#xff0c;改为嵌入变量的文件模版Dockerfile 修改&#xff0c;通过envsubst将换将变量注入模版后再运行nginxdocker-compose配置&#xff0c;通过environment动态修改变量 defau…...

ExpressLRS开源之接收机固件编译烧录步骤

ExpressLRS开源之接收机固件编译烧录步骤 1. 源由2. 编译步骤2.1 推荐源代码指定方案2.2 方法一&#xff1a;ELRS Configurator步骤一&#xff1a;下载ELRS Configurator工具步骤二&#xff1a;安装ELRS Configurator工具步骤三&#xff1a;使用ELRS Configurator工具进行配置步…...

提取视频文件里的音频和无声视频

一、提取视频文件里的音频&#xff1a; public static void generateMediaRadio(){// 视频提取器MediaExtractor extractor new MediaExtractor();try {//本地视频文件extractor.setDataSource("/storage/emulated/0/mjyyfep/alpha.mp4");//网络视频文件 // …...

SpringBoot原理

一、Bean原理 1、配置文件的优先级 SpringBoot项目当中支持的三类配置文件&#xff1a; ​ - application.properties - application.yml - application.yaml 配置文件优先级排名&#xff08;从高到低&#xff09;&#xff1a; 1. properties配置文件 2. yml配置文件 3. yaml…...

MySQL事务原理、MVCC详解

事务原理 1 事务基础 1). 事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 2). 特性 原子性&#xff08;Atomi…...

在Windows操作系统上安装Neo4j数据库

在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 点击 MySQL可跳转至MySQL的官方下载地址。 在VUE3项目的工程目录中&#xff0c;通过以下命令可生成node_modules文件夹。 npm install&#xff08;1&am…...

国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

国民八路参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&#xff0…...

24 Linux高级篇-备份与恢复

24 Linux高级篇-备份与恢复 文章目录 24 Linux高级篇-备份与恢复24.1 安装dump和restore24.2 使用dump备份24.4 使用restore恢复 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0c;下载链接见文末&#xff1a; 《鸟哥的…...

微信小程序的图书馆预约系统设计与实现

摘 要 近年来随着社会竞争压力的不断加剧&#xff0c;人们需要不断充实自己的学识来提升自己的竞争力&#xff0c;对于在校的大学生而言需要利用在校期间实现考研考编的内容&#xff0c;职场的上班族需要通过考取职业技能资格证书来实现升职加薪&#xff0c;各行各业的人们都在…...

《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办

随着网络强国和数字中国建设的步伐加快&#xff0c;建设规模宏大、结构合理、素质优良的人才队伍成为一项重要工作。知了汇智作为数字产教融合基地&#xff0c;通过与高校、企业等多方合作&#xff0c;建立了完整的网络安全人才培养生态链。凭借自身技术优势和丰富的产业资源&a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...