字节码验证 的高度对jvm的优化

本文详细解析了JVM优化的核心层面——堆栈分配与内存大小调节,并进一步探讨了方法区、虚拟机栈等细微优化。重点介绍了类加载过程的细节,包括加载、验证、准备、解析和初始化阶段,以及如何通过代码调整来优化JVM性能。同时,文章建议在类已被充分验证的情况下,考虑关闭部分验证措施以提升加载速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员对虚拟机的优化大多集中在堆栈的分配以及和内存大小的调节的层面上,在这个层面上的调节也是jvm影响最大的部分。但是我们仍然可以从比较细的层面上对jvm进一步优化。
稍微进一步,是对 方法区,Java虚拟机栈,本地方法栈,堆,甚至程序计数器方面进行点滴的优化。
再小一点,我们先来理解一个概念。
在虚拟机执行子系统中存在一个类加载过程,这个过程包含加载、验证、准备、解析、和初始化,当然,在类加载之后还应当包含执行和卸载这两个阶段。
加载即是虚拟机通过一个类的全限定名来获取定义此类的二进制字节流。(全限定名:com/sun/Summer),然后将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(运行时数据结构前面已经介绍,即堆、方法区、本地方法区、Java虚拟机栈、程序计数器) 然后虚拟机在堆上生成一个java.lang.Class对象,作为访问方法区的一个外部入口。

接下来是验证,验证是连接阶段的第一步,是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段非常重要,并且验证阶段的工作量在虚拟机的类加载子系统中占了很大一部分,所以我们有必要在码代码的时候,注意Jvm的这一特性,就可以获得可观的虚拟机回报。
验证阶段包含 文件格式验证、元数据验证、字节码验证和符号验证四个阶段。
1 文件格式验证比较简单,主要是验证版本、常量类型、字符编码以及引用地址。当然其实际验证要远远不止这些而且要复杂的多。
2 元数据验证 主要检查类 是否有父类,是否实现了必要的方法,是否被非法继承,等等。
3 字节码验证 ,字节码验证是最复杂的一个阶段,主要是进行数据流和控制流的分析。
主要对类的方法体进行安全验证。包括 非法类型转换,跳转指令跳转到方法体之外,无限循环等等,由于数据流验证的高复杂性会在一定程度上拖慢虚拟机,所以我们在码代码的时候,尽量避免使用一些类型推导类的手段去实现,尽量使用类型检查来减少虚拟机检查时间。
jdk 1.6 之后的javac 提供了 StackMapTable 属性,这一属性可以将字节码验证的类型推导转化为类型检查从而节省一些时间。
我们也可以通过在 JDK 1.6 -XX:-UseSplitVerifier 来关停javac 编译器中的 StackMapTable 优化属性,或者通过-XX:+FailOverToOldVerifier 要求在类型校验失败的时候回退懂啊旧的类型推导方式进行校验。


如果所运行的代码(包括自己写的和第三方的代码) 都已经被反复使用和验证过,在实施阶段就可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,以缩短虚拟机在类加载阶段的耗时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值