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:Grounded Language-Image Pre-training Code 文章目录 1. 背景2. 方法(1)Unified Formulation传统目标检测grounding目标检测 (2)Language-Aware Deep Fusion(3)Pre-training with Scala…...
成集云 | 钉钉财务费用单同步至畅捷通 | 解决方案
源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分,在企业的发展和成长中扮演着重要角色,成集云以钉钉费用单OA审批与畅捷通TCloud系统为例,与钉钉连接器深度融合,通过数据处理和字段匹配实现了费用…...
Redis——》死锁
推荐链接: 总结——》【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(函数,作用域和闭包)
目录 一,什么是函数1.1,常用系统函数1.2,函数声明 1.3,函数表达式二,预解析2.1,函数自调用 2.2,回调函数三,变量的作用域3.1,隐式全局变量 四,作用域与块级作…...
C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密
C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密,为了演示方便本问使用的是Visual Studio 2022 来构建代码的 1、新建项目,之后选择 项目 鼠标右键选择 管理NuGet程序包管理,输入 BouncyCastle 回车 添加BouncyCastle程序包 2、代码如下&am…...
【docker-compose】【nginx】动态配置
需求:部署前端镜像时需要动态修改nginx反向代理的后端服务的ip地址 原.conf配置调整,改为嵌入变量的文件模版Dockerfile 修改,通过envsubst将换将变量注入模版后再运行nginxdocker-compose配置,通过environment动态修改变量 defau…...
ExpressLRS开源之接收机固件编译烧录步骤
ExpressLRS开源之接收机固件编译烧录步骤 1. 源由2. 编译步骤2.1 推荐源代码指定方案2.2 方法一:ELRS Configurator步骤一:下载ELRS Configurator工具步骤二:安装ELRS Configurator工具步骤三:使用ELRS Configurator工具进行配置步…...
提取视频文件里的音频和无声视频
一、提取视频文件里的音频: public static void generateMediaRadio(){// 视频提取器MediaExtractor extractor new MediaExtractor();try {//本地视频文件extractor.setDataSource("/storage/emulated/0/mjyyfep/alpha.mp4");//网络视频文件 // …...
SpringBoot原理
一、Bean原理 1、配置文件的优先级 SpringBoot项目当中支持的三类配置文件: - application.properties - application.yml - application.yaml 配置文件优先级排名(从高到低): 1. properties配置文件 2. yml配置文件 3. yaml…...
MySQL事务原理、MVCC详解
事务原理 1 事务基础 1). 事务 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 2). 特性 原子性(Atomi…...
在Windows操作系统上安装Neo4j数据库
在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 一、在Windows操作系统上安装Neo4j数据库 点击 MySQL可跳转至MySQL的官方下载地址。 在VUE3项目的工程目录中,通过以下命令可生成node_modules文件夹。 npm install(1&am…...
国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
国民八路参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022࿰…...
24 Linux高级篇-备份与恢复
24 Linux高级篇-备份与恢复 文章目录 24 Linux高级篇-备份与恢复24.1 安装dump和restore24.2 使用dump备份24.4 使用restore恢复 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示,下载链接见文末: 《鸟哥的…...
微信小程序的图书馆预约系统设计与实现
摘 要 近年来随着社会竞争压力的不断加剧,人们需要不断充实自己的学识来提升自己的竞争力,对于在校的大学生而言需要利用在校期间实现考研考编的内容,职场的上班族需要通过考取职业技能资格证书来实现升职加薪,各行各业的人们都在…...
《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办
随着网络强国和数字中国建设的步伐加快,建设规模宏大、结构合理、素质优良的人才队伍成为一项重要工作。知了汇智作为数字产教融合基地,通过与高校、企业等多方合作,建立了完整的网络安全人才培养生态链。凭借自身技术优势和丰富的产业资源&a…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
