- 浏览: 985648 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
Java编译器优化方法简介
你对Java编译器优化的概念和方法是否熟悉,这里和大家分享一下,Java应用程序的编译过程与静态编译语言(例如C或C++)不同。静态编译器 直接把源代码转换成可以直接在目标平台上执行的机器代码,不同的硬件平台要求不同的编译器。Java编译器把Java源代码转换成可移植的JVM字节码。
两条编码准则与Java编译器
我们在写代码时,常常会提到两条原则:
1、方法要尽量短,大方法要分解成小方法;
2、不要重复发明轮子。
我们在强调这两个原则的时候,往往只关注的是代码简洁、易维护等方便我们人的因素,其实这样做还可以大大方便Java编译器优化代码。
Java编译器优化简介:
Java应用程序的编译过程与静态编译语言(例如C或C++)不同。静态编译器直接把源代码转换成可以直接在目标平台上执行的机器代码,不同的硬件 平台要求不同的编译器。Java编译器把Java源代码转换成可移植的JVM字节码。与静态编译器不同,Javac几乎不做什么优化,在静态编译语言中应 当由编译器进行的优化工作,在Java中是在程序执行的时候,由运行时执行优化。
即时编译
对于证实概念的实现来说,解释是合适的,但是早期的JVM由于太慢。下一代JVM使用即时(JIT)编译器来提高执行速度。按照严格的定义,基于
JIT的虚拟机在执行之前,把所有字节码转换成机器码,但是以惰性方式来做这项工作:JIT只有在确定某个代码路径将要执行的时候,才编译这个代码路径
(因此有了名称“即时编译”)。这个技术使程序能启动得更快,因为在开始执行之前,不需要冗长的编译阶段。
JIT技术看起来很有前途,但是它有一些不足。
JIT消除了解释的负担(以额外的启动成本为代价),但是由于若干原因,代码的优化等级仍然是一般般。为了避免Java应用程序严重的启动延 迟,JIT编译器必须非常迅速,这意味着它无法把大量时间花在优化上。所以,早期的JIT编译器在进行内联假设(inliningassumption) 方面比较保守,因为它们不知道后面可能要装入哪个类。
虽然从技术上讲,基于JIT的虚拟机在执行字节码之前,要先编译字节码,但是JIT这个术语通常被用来表示任何把字节码转换成机器码的动态编译过程——即使那些能够解释字节码的过程也算。
HotSpot动态编译
HotSpot执行过程组合了编译、性能分析以及动态编译。它没有把所有要执行的字节码转换成机器码,而是先以解释器的方式运行,只编译“热门”代 码——执行得最频繁的代码。当HotSpot执行时,会搜集性能分析数据,用来决定哪个代码段执行得足够频繁,值得编译。只编译执行最频繁的代码有几项性 能优势:没有把时间浪费在编译那些不经常执行的代码上;这样,编译器就可以花更多时间来优化热门代码路径,因为它知道在这上面花的时间物有所值。而且,通 过延迟编译,编译器可以访问性能分析数据,并用这些数据来改进优化决策,例如是否需要内联某个方法调用。
为了让事情变得更复杂,HotSpot提供了两个Java编译器:客户机编译器和服务器编译器。默认采用客户机编译器;在启动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编译器会知道这个轮子要好好优化,让他赚的更快。
【编辑推荐】
发表评论
-
A Collection of JVM Options
2011-06-24 12:59 1131A Collection of JVM Options ... -
java中堆(heap)和堆栈(stack)有什么区别
2011-05-10 14:29 863stack 和 heep 都是内存的一部分 stack 空间 ... -
JVM & Memory (5) final
2011-05-10 14:25 963先说tuning,gc有两个指标,一个是frequentcy( ... -
JVM & Memory (4) gc
2011-05-10 14:22 887不同的JVM实现对堆结构的设计有所不同,这里先说说共性的,然后 ... -
JVM & Memory (3) thread
2011-05-10 14:21 878以下继续探讨,说说jvm ... -
JVM & Memory (2) java.exe
2011-05-10 14:20 915上篇说到了关于java heap ... -
JVM & Memory (1) paging
2011-05-10 14:19 934近期看了一些有关JVM和内存的资料,为了避免遗忘,特在这里作一 ... -
JDK TOOLS
2011-05-10 14:15 784以下这几种工具(存在于 ... -
jvm日志分析工具应用
2011-05-10 14:14 2778涛涛学习笔记之gc日志分析工具 测试环境:xp+weblog ... -
JVM优化配置
2011-05-10 13:56 908OOM 这个缩写就是Java程 ... -
高手详细介绍JVM是什么?
2011-05-10 13:52 837首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实 ... -
JVM监控工具介绍
2011-03-22 14:25 859... -
正确认识java JVM与c/c++的执行效率
2011-03-22 10:43 1376认为Java 不能写JVM是完全错误的。JNode是一个用 ... -
Java虚拟机(JVM)参数配置说明
2011-03-22 10:26 958Java虚拟机(JVM)参数配置说明 ... -
解析 Java 类和对象的初始化过程
2011-03-21 23:40 881解析 Java 类和对象的初始化过程 由一个单态模式引出的问 ... -
JDK的概念、组成及JDK常用包
2011-03-18 22:09 1106JDK概述 JDK (Java Development ... -
安装JDK后JRE与JVM联系浅谈
2011-03-18 22:08 891安装JDK后JRE、JVM之间的 ... -
详细介绍什么是Java虚拟机
2011-03-18 22:07 809本文由浅入深,先从什么是Java虚拟机、Java虚拟机 ... -
认识Java虚拟机及其性能
2011-03-18 22:04 702Java虚拟机(Java virtual ... -
JVM GC调整优化过程全揭秘
2011-03-18 22:03 811JVM GC调整优化是以个极为复杂的过程,由于各个程序具备 ...
相关推荐
本书还讲述了通用的编译器实现技术,包括代码生成、寄存器分配以及大多数书籍未涉及的函数式编程语言和面向对象语言,并用实际的Java类详细说明了编译器各模块间的接口。 本书的第一部分——编译器基础,适合作为第...
Java虚拟机即时编译器以方法为单位进行编译,编译器将字节码方法编译成可执行代码.
这是使用java实现的c语言编译器,其中包括Java源代码和c语言的测试程序,包括我们的输出结果的截图和课程设计说明书,如果你的课程设计也是这个的话,用这个肯定够用了,包括词法分析,语法分析,语义分析,分别打印...
Java性能优化: 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,...Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。 .......
从学习编译器的结构来掌握理论,并通过编程技术将编译理论融合于实践中。本书主要内容分为两部分,第一部分 为编译基础(第1章至第12章),主要包括:词法分析、语法分析、抽象语法、语义分析、活动记录、翻译成中间...
21丨深入JVM即时编译器JIT,优化Java编译.html
LLVM编译器基础架构,此目录及其子目录包含LLVM的源代码,LLVM是一个用于构建高度优化的编译器、优化器和运行时环境的工具包。LLVM项目有多个组件。该项目的核心本身被称为“LLVM”。这包含处理中间表示并将其转换为...
栈展开是被编译器和Java虚拟机普遍使用的一种实现异常处理机制的方法。本文针对传统的栈展开算法中存在的不足,提出了一种改进的栈展开算法,并基于Open64的栈展开函数库,对该算法进行了代码实现和测试。该算法可以...
说到编译,我猜你一定会想到 .java 文件被编译成 .class 文件的过程,这个编译我们一般称为前端编译。Java 的编译和运行过程非常复杂,除了前端编译,还有运行时编译。由于机器无法直接运行 Java 生成的字节码,所以...
做一个小编译器(尽管经过了课程组简化)难度也还是很高的,主要体现在其工程量之大。本学期 后做完优化我的编译器包括各种debug的代码,共有8000行左右的。
语法分析:根据程序的语法结构检查语法错误,利用Java Cup将文法文件生成语法分析器程序 抽象语法树:基于语法结构生成抽象语法树 语义分析:进行变量和类型检查等 活动记录:记录函数调用 翻译:翻译生成中间表示树...
编译器:JDK包含了Java编译器(javac),可以将Java源代码编译成字节码文件(.class文件)。 JVM(Java虚拟机):JDK包含了Java虚拟机,可以在不同平台上运行Java程序,实现了Java的“一次编写,到处运行”的特性。...
主要介绍了java9的JShell小工具和编译器两种自动优化方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
编译原理课程设计源码 词法分析,编译器,有可执行代码
老虎编译器这是一个Java 编译器,用于小老虎语言。 Tiger 支持基本运算、自定义数据类型和浮点运算。 目标平台为MIPS,目前未实现函数调用。 存在扫描、解析、代码优化和生成。 编译器前端采用ANTLR构建,采用抽象...
本文描述了attribute文法,基于该文法优化Java代码,是高级的形式化的编译优化技术。可以作为高级编译器的优化的参考文档。
避免使用Java序列化14讲多线程之锁优化(下):使用乐观锁优化并行操作16讲多线程调优(下):如何优化多线程上下文切换17讲并发容器的使用:识别不同场景下最优容器21讲深入JVM即时编译器JIT,优化Java编译25讲答疑...
本文深入分析了Java 程序设计中Java 编译器对java 源文件和JVM 对class 类文件的编码/解码过程,通过此过程的解析透视出了Java 编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java 中文问题的方法。
健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...