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

两条编码准则与java编译器

    博客分类:
  • java
阅读更多
我们在写代码时,常常会提到两条原则:
1、方法要尽量短,大方法要分解成小方法;
2、不要重复发明轮子。
我们在强调这两个原则的时候,往往只关注的是代码简洁、易维护等方便我们人的因素,其实这样做还可以大大方便java编译器优化代码。
java编译器优化简介:
Java 应用程序的编译过程与静态编译语言(例如 C 或 C++)不同。静态编译器直接把源代码转换成可以直接在目标平台上执行的机器代码,不同的硬件平台要求不同的编译器。 Java 编译器把 Java 源代码转换成可移植的JVM 字节码。与静态编译器不同,javac 几乎不做什么优化,在静态编译语言中应当由编译器进行的优化工作,在 Java 中是在程序执行的时候,由运行时执行优化。

即时编译
对于证实概念的实现来说,解释是合适的,但是早期的 JVM 由于太慢。下一代 JVM 使用即时 (JIT) 编译器来提高执行速度。按照严格的定义,基于 JIT 的虚拟机在执行之前,把所有字节码转换成机器码,但是以惰性方式来做这项工作:JIT 只有在确定某个代码路径将要执行的时候,才编译这个代码路径(因此有了名称“ 即时 编译”)。这个技术使程序能启动得更快,因为在开始执行之前,不需要冗长的编译阶段。
JIT 技术看起来很有前途,但是它有一些不足。JIT 消除了解释的负担(以额外的启动成本为代价),但是由于若干原因,代码的优化等级仍然是一般般。为了避免 Java 应用程序严重的启动延迟,JIT 编译器必须非常迅速,这意味着它无法把大量时间花在优化上。所以,早期的 JIT 编译器在进行内联假设(inlining assumption)方面比较保守,因为它们不知道后面可能要装入哪个类。
虽然从技术上讲,基于 JIT 的虚拟机在执行字节码之前,要先编译字节码,但是 JIT 这个术语通常被用来表示任何把字节码转换成机器码的动态编译过程 —— 即使那些能够解释字节码的过程也算。

HotSpot 动态编译

HotSpot 执行过程组合了编译、性能分析以及动态编译。它没有把所有要执行的字节码转换成机器码,而是先以解释器的方式运行,只编译“热门”代码 —— 执行得最频繁的代码。当 HotSpot 执行时,会搜集性能分析数据,用来决定哪个代码段执行得足够频繁,值得编译。只编译执行最频繁的代码有几项性能优势:没有把时间浪费在编译那些不经常执行的代码上;这样,编译器就可以花更多时间来优化热门代码路径,因为它知道在这上面花的时间物有所值。而且,通过延迟编译,编译器可以访问性能分析数据,并用这些数据来改进优化决策,例如是否需要内联某个方法调用。为了让事情变得更复杂,HotSpot 提供了两个编译器:客户机编译器和服务器编译器。默认采用客户机编译器;在启动 JVM 时,您可以指定 -server 开关,选择服务器编译器。服务器编译器针对最大峰值操作速度进行了优化,适用于需要长期运行的服务器应用程序。客户机编译器的优化目标,是减少应用程序的启动时间和内存消耗,优化的复杂程度远远低于服务器编译器,因此需要的编译时间也更少。

HotSpot 服务器编译器能够执行各种样的类。它能够执行许多静态编译器中常见的标准优化,例如代码提升( hoisting)、公共的子表达式清除、循环展开(unrolling)、范围检测清除、死代码清除、数据流分析,还有各种在静态编译语言中不实用的优化技术,例如虚方法调用的聚合内联。

持续重新编译

HotSpot 技术另一个有趣的方面是:编译不是一个全有或者全无(all-or-nothing)的命题。在解释代码路径一定次数之后,会把它重新编译成机器码。但是 JVM 会继续进行性能分析,而且如果认为代码路径特别热门,或者未来的性能分析数据认为存在额外的优化可能,那么还有可能用更高一级的优化重新编译代码。JVM 在一个应用程序的执行过程中,可能会把相同的字节码重新编译许多次。为了深入了解编译器做了什么,可以 -XX:+PrintCompilation 标志调用 JVM,这个标志会使编译器(客户机或服务器)每次运行的时候打印一条短消息。

栈上(On-stack)替换

HotSpot 开始的版本编译的时候每次编译一个方法。如果某个方法的累计执行次数超过指定的循环迭代次数(在 HotSpot 的第一版中,是 10,000 次),那么这个方法就被当作热门方法,计算的方式是:为每个方法关联一个计数器,每次执行一个后向分支时,就会递增计数器一次。但是,在方法编译之后,方法调用并没有切换到编译的版本,需要退出并重新进入方法,后续调用才会使用编译的版本。结果就是,在某些情况下,可能永远不会用到编译的版本,例如对于计算密集型程序,在这类程序中所有的计算都是在方法的一次调用中完成的。重量级方法可能被编译,但是编译的代码永远用不到。

HotSpot 最近的版本采用了称为 栈上(on-stack)替换 (OSR) 的技术,支持在循环过程中间,从解释执行切换到编译的代码(或者从编译代码的一个版本切换到另一个版本)。

从java编译、执行优化的原理可以看出,编译器会将“热门代码块”、“热门方法”持续优化,以提高性能,再回顾我们常常强调的两个原则:
1、尽量写小方法。小方法意味着功能单一、重用性高,自然会被很多地方用到,容易变成“热门方法”。
2、不重复发明轮子,尽量用已存在的轮子。大家共用一个“轮子”,自然就是“热门”轮子,编译器会知道这个轮子要好好优化,让他赚的更快。
分享到:
评论

相关推荐

    java编译器

    7. IDE集成:大多数现代Java集成开发环境(如Eclipse、IntelliJ IDEA)内置了编译器,提供图形化的编码、编译和运行环境。 总之,Java编译器是Java开发不可或缺的部分,理解其工作原理和使用方法对于Java程序员来说...

    JAVA编译器原代码

    Java编译器是将源代码(.java文件)转换为字节码(.class文件)的工具,使得Java程序可以在任何支持Java虚拟机(JVM)的平台上运行。本资源包含了一个简单的Java编译器的原始代码,对于理解Java语言的编译过程以及...

    Java编译器源代码

    Java编译器,通常被称为Javac,是Java开发工具包(JDK)的重要组成部分,负责将源代码转换为可执行的字节码。在Java编程语言中,编译过程并非像C++或C那样直接生成本地机器代码,而是生成跨平台的中间表示——字节码...

    gui.rar_java 编译器

    【标题】"gui.rar_java 编译器"指的是一个压缩包文件,其中包含了作者自己编写的Java编程语言的图形用户界面(GUI)编译器。这个编译器设计用于提供一个友好的图形环境,帮助开发者更方便地编译Java源代码。 【描述...

    miniJava编译器

    从MiniJava到MIPS的转化,不仅需要理解两种语言的特性,还需要深入掌握编译器设计和实现的技术。对于学习者而言,理解和修复这个bug不仅能提升对编译原理的理解,也是对编程技巧的一次深度锻炼。

    windows下的java编译器和jdk.zip

    "windows下的java编译器和jdk.zip"这个压缩包包含了这两个关键组件。 JDK是Java开发的基础,它提供了编译、调试和运行Java程序所需的所有工具。在这个压缩包中,文件`jdk-8u241-windows-x64.exe`是Oracle公司发布的...

    MiniJava编译器

    5. **编译器设计与实现**:在MiniJava-pj(revised)项目中,学生可能需要实现一个完整的编译器,包括编写词法分析器(如使用正则表达式)、语法分析器(如使用递归下降分析或LR解析)以及代码生成器。这个过程中,...

    visual_java_src.rar_java 编译器_java编译器_编译器

    Java 编译器是将Java源代码转换为可执行的字节码的工具,它是Java开发过程中的关键组件。Visual Java Src是一个特定的项目,它旨在提供一个类似于Visual Java的图形化用户界面(GUI),使得Java编程更加直观和便捷。...

    C语言实现的Java编译器

    在本项目中,"C语言实现的Java编译器"是一个独特的尝试,它将传统的编译原理理论应用于实际编程中,以C语言作为基础来构建一个能够解析和处理Java源代码的工具。这个项目主要涉及两个核心部分:词法分析器(Scanner...

    手机Java编译器

    手机Java编译器往往需要与Android SDK配合使用,以确保编译出的程序能够兼容Android平台。 3. **Android Studio**:Google官方推荐的Android开发IDE,集成了Java编译器和各种辅助开发功能,如代码提示、调试器、...

    C#写的java编译器

    标题中的"C#写的java编译器"是一个独特的项目,它使用C#编程语言来实现一个Java源代码的编译器。这个项目对于了解C#语言和编译原理的开发者来说,是一个有趣的挑战和学习资源。它揭示了如何利用C#构建一个能够处理...

    java编译器源代码

    Java编译器源代码是Java开发工具包(JDK)的一部分,主要负责将Java源代码转换为可执行的字节码。深入理解Java编译器的源代码对于开发者来说是提升编程技能、优化代码性能以及了解Java语言底层运作机制的重要途径。...

    java编译器源代码.rar

    在开发环境中,如Eclipse和IntelliJ IDEA,Java编译器与IDE紧密集成,提供实时错误检测、自动重构和快速修复等功能。 9. **Java源码版本控制**: Java编译器的源代码通常使用版本控制系统(如Git)进行管理,以...

    Java小型编译器

    Java小型编译器知识点总结 Java小型编译器是Java语言中的一种编译器,用于将Java源代码转换为机器代码或字节码。下面是Java小型编译器的知识点总结: 1. Lexical Analysis:词法分析是编译器的第一阶段,负责将源...

    JAVA编译器,适合新手,更时候老手

    本程序使用的都是黑窗口模式,换了背景色,调用的都是原编译器在DOS模式下的javac和java程序。虽然比不上Eclipse的集成度,但个人测试了几十个JAVA程序,感觉很上手,所以奉献给大家,资源分不多,感谢大家支持!【另...

    java编译器(源代码)

    java编译器 (源代码+gui图形界面+英文报告) 包括词法分析,语法分析 三地址代码生成。 可以先看看http://blog.chinaunix.net/u/21684/showart_218863.html

    小型的java编译器(GUI)

    总的来说,这个小型的Java编译器(GUI)是一个以Swing为基础,提供便捷的代码编辑、管理与执行功能的工具,特别适合那些希望在轻量级环境下高效开发Java应用的用户。通过其简洁的界面和直观的操作流程,降低了编程的...

    java编译器源码 java compiler Source

    java编译器gjc源码 Java编译器源码 java编译环境 -GJC source java compiler java compiling environment java compiler code java compiler Source

Global site tag (gtag.js) - Google Analytics