`
annan211
  • 浏览: 463332 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • jvm
 
阅读更多
程序员对虚拟机的优化大多集中在堆栈的分配以及和内存大小的调节的层面上,在这个层面上的调节也是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 参数来关闭大部分的类验证措施,以缩短虚拟机在类加载阶段的耗时。
分享到:
评论

相关推荐

    行业分类-设备装置-字节码中间表示程序的分模块形式化验证方法.zip

    在IT行业中,字节码中间表示(Bytecode Intermediate Representation,简称BCIR)是编译器设计中的一个重要概念,尤其在虚拟机(如Java虚拟机JVM)中扮演着核心角色。这种中间表示允许编译器进行高效分析、优化以及...

    探索Java虚拟机的心脏:字节码执行全解析

    1. **验证**:确保字节码符合JVM规范,没有违反语义规则。 2. **准备**:为类中的静态变量分配内存并设置初始值。 3. **解析**:将符号引用转换为直接引用,即将类或接口、字段、方法等的符号名称转换为其实际地址。...

    新手必须学习资料:JVM详解

    * Java 字节码:Java 字节码是 JVM 的执行单元,负责执行 Java 程序。 * 类加载器:类加载器是 JVM 的一部分,负责将 Java 类文件加载到内存中。 * 执行引擎:执行引擎是 JVM 的一部分,负责执行 Java 字节码。 ...

    byte code 操作

    它由JVM通过类加载器加载,验证器(Verifier)负责检查字节码文件是否符合JVM规范,以保证安全运行。 为何需要操作Java字节码?操作Java字节码可以用于多种场景,比如程序分析、找到代码中的bug、检查代码复杂性、...

    java虚拟机

    字节码验证是JVM安全性的关键环节。在类加载到JVM之前,会进行严格的验证,确保字节码符合Java语言规范,防止恶意代码执行,如栈溢出、非法操作数等。 内存管理是JVM的重要职责,包括堆内存、方法区、栈内存、程序...

    Java教案——3章 个人学习资料

    3. **JVM组件**:JVM包含类加载器(class loader)、字节码验证器(bytecode verifier)和JIT(Just-in-time)编译器。类加载器负责加载类文件,验证器确保字节码安全,JIT编译器则在运行时将字节码优化为本地机器码...

    深入java虚拟机 高清pdf 高清高清高清

    它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者提升程序的运行效率和稳定性。 1. **Java虚拟机概述**:Java虚拟机是Java平台的核心组件,它...

    叶子猿 jvm教学视频高清110集教学视频

    - **类加载器**:负责将.class文件中的字节码加载到内存中,并进行验证、准备和解析等初始化工作。 - **运行时数据区**:包括方法区、堆、栈、本地方法栈和程序计数器等。这些区域分别用于存储不同的数据类型和信息...

    Java and the Java Virtual Machine.pdf

    - **跨平台性**:通过编译成字节码并由JVM解释执行的方式,确保了Java程序可以在多种操作系统上运行。 - **面向对象**:Java支持封装、继承和多态等面向对象特性。 - **自动内存管理**:Java通过垃圾回收机制自动...

    java虚拟机规范

    Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它提供了运行时环境,使得Java程序可以在任何安装了兼容JVM的操作系统上运行,而无需重新编译。这种跨平台特性是通过将Java源代码编译为一种中间格式——字节码...

    深入java虚拟机

    JVM是Java平台的核心组成部分,它负责执行字节码,为开发者提供跨平台的运行环境。Java程序被编译成与平台无关的字节码,由JVM负责解释执行。JVM的运行主要包括类加载、代码解析、执行、垃圾回收等过程。 在类加载...

    java面试-初级篇

    7. **安全性**:Java提供了多种安全机制,如实时内存分配、字节码验证以及异常处理机制等,确保程序在执行过程中不会受到恶意攻击或出现非法行为。 #### 二、Java虚拟机(JVM) 1. **字节码与解释器**:Java程序...

    jvm系列一java类的加载机制.doc

    这一阶段包括文件格式、元数据、字节码和符号引用验证四个子阶段。验证虽然不强制,但对于类的稳定性和安全性至关重要。 准备阶段是为类的静态变量分配内存,并初始化为默认值。实例变量则在对象实例化时分配。此时...

    java中的四个核心概念_.docx

    JVM是Java的核心组成部分,它的主要功能是加载、验证、执行class文件中的字节码。类装载器是JVM的一部分,负责加载程序和API中的class文件。JVM有两种主要的执行引擎实现: - **解释器**:简单地解释执行字节码,...

    开发资料下载JAVA优化编程(上)

    JVM是运行Java程序的平台,它负责将Java字节码转换为机器码。因此,对JVM的了解可以帮助开发者利用JVM的性能特性来优化应用。例如,通过理解垃圾收集(GC)的机制来减少不必要的内存回收操作,这可以通过合理管理...

    Java深度历险

    - **安全性**:JVM会在字节码执行前对其进行验证,确保其不会违反安全策略。 - **灵活性**:字节码可以被动态地生成或修改,为实现诸如AOP(面向切面编程)、动态代理等功能提供了可能。 #### 动态编译Java源文件 ...

    Java虚拟机规范(Java SE 7).pdf

    9. **安全性**:JVM提供了安全管理框架,包括类加载的权限检查、字节码验证等,以保证代码的可信度。 10. **性能优化**:虽然规范不规定具体的实现方式,但提供了性能相关的指导原则,如栈深度限制、内存分配策略等...

    深入java虚拟机学习

    Java虚拟机(JVM)是Java平台的核心组件之一,它的主要职责是在计算机上执行Java字节码。字节码是一种中间代码形式,由Java编译器生成,并可以在任何支持JVM的平台上运行而无需重新编译。这种特性使得Java程序具有高度...

    java的跨平台性

    每个JVM都负责将Java字节码转换为本机机器指令,这个过程叫做即时编译(JIT, Just-In-Time Compilation)。JIT技术允许JVM在运行时优化代码,提高性能,同时保持跨平台兼容性。 Java的类加载机制也是实现跨平台性的...

Global site tag (gtag.js) - Google Analytics