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

这篇具有很好参考价值的文章主要介绍了JVM——类加载与字节码技术—类加载器+运行期优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

5.类加载器

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

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

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

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

双亲委派上级机制

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

5.1 启动类加载器

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm使用启动类加载器命令行加载类。 JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm

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

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

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

5.2 扩展类加载器

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

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

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

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

jar -cvf 包名.jar  类路径 

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm 再次运行测试类

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

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

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

5.3 双亲委派模式

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

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

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

 

5.4 线程上下文类加载器

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

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm 原本是应该用启动类加载器完成相关联的类的加载,这里却使用了应用程序类加载器

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

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

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

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

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

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm 线程上下文类加载器是在每个线程启动时由jvm把应用程序类加载器赋值给当前线程,将来线程对调用getContextClassLoader()可以拿到应用程序类加载器。

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

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

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

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

5.5自定义类加载器

使用场景

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

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

定义类加载器

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm 测试类

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm 使用不同类加载器加载同一个类,两个类比较不仅要包名类名相同,还要类加载器对象相同才能确定是同一个类。

6.运行期优化

6.1即时编译

分层编译

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

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

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

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

 原因

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

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

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

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

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

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

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

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

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

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

方法内联

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

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

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

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

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

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

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

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

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

 禁用内联的参数

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

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

字段优化

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

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

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

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

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

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

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

 三种循环方式进行累加。

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

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

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

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

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

 禁止方法内联之后

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

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

第一个的:

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

 第二个的:

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

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

第三个的:

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

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

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

6.2 反射优化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JVM——类加载与字节码技术—类加载器+运行期优化,JVM+JUC,jvm文章来源地址https://www.toymoban.com/news/detail-677556.html

到了这里,关于JVM——类加载与字节码技术—类加载器+运行期优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM之类加载与字节码

    根据 Java 虚拟机规范,Class 文件通过 ClassFile 定义。ClassFile 的结构如下: 通过分析 ClassFile 的内容,我们便可以知道 class 文件的组成。 下面这张图是通过 IDEA 插件 jclasslib 查看的,你可以更直观看到 Class 文件结构。使用 jclasslib 不光可以直观地查看某个类对应的字节码文件

    2024年02月14日
    浏览(34)
  • JVM之类加载与字节码(一)

    根据 Java 虚拟机规范,Class 文件通过 ClassFile 定义。ClassFile 的结构如下: 通过分析 ClassFile 的内容,我们便可以知道 class 文件的组成。 下面这张图是通过 IDEA 插件 jclasslib 查看的,你可以更直观看到 Class 文件结构。使用 jclasslib 不光可以直观地查看某个类对应的字节码文件

    2024年02月14日
    浏览(37)
  • JVM之类加载与字节码(二)

    类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段::加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以

    2024年02月13日
    浏览(83)
  • p7付费课程笔记:jvm基础知识、字节码、类加载器

    机器语言-编程语言-高级语言(java,c++,Go,Rust等) 面向过程–面向对象-面向函数 java是一种面向对象、静态类型、编译执行,有VM(虚拟机)/GC和运行时、跨平台的高级语言。重点:VM(虚拟机)/GC(Garbage Collector)和运行时、跨平台。 跨平台步骤:字节码文件被虚拟机加载(

    2024年02月10日
    浏览(31)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(75)
  • JVM性能优化 —— 类加载器,手动实现类的热加载

    每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将c

    2024年02月08日
    浏览(28)
  • Java安全——JVM类加载器(1),啃下这些Framework技术笔记

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月29日
    浏览(24)
  • 形象谈JVM-第三章-即时编译器优化技术

    即时编译器优化技术一览: 相信许多同学看完这个表格,脑子里面嗡嗡的,这些名字也是晦涩难懂,要实现这些优化的技术确实有比较大的难度,但是咱们只是学习,去理解这些技术,其实并不难,下面咱们直接开讲。 首先需要明确一点的,作者是为了讲解方便,使用java的

    2024年02月12日
    浏览(33)
  • 深入理解JVM后端优化技术-锁粗化(Lock Coarsening)

    锁粗化(Lock Coarsening/Lock Merging)是JIT编绎器对内部锁的具体实现所做的一种优化。 深入理解jvm执行引擎-CSDN博客 深入理解JVM后端优化技术-方法内联-CSDN博客 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客 深入理解JVM后端优化技术-锁消除(Lock Elision)-CSDN博客 锁粗化默认

    2024年04月10日
    浏览(32)
  • 【JVM001】宋红康JVM字节码举例

    1 Integer 说明: 1 String package jvmT; 说明: 1 Object 执行结果: 说明: (1)成员变量(非静态)赋值过程:①默认初始化—②显示初始化/代码块中初始化—③构造器中初始化—④有了对象之后可以f.x或者f.method()设置属性值 (2)方法有多态,属性没有多态 main方法的字节码文件

    2024年02月06日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包