在HotSpot虚拟机中,有两个技术是至关重要的,即动态编译(Dynamic compilation)和Profiling。
HotSpot是如何动态编译Javad的bytecode呢?Java bytecode是以解释方式被load到虚拟机的。HotSpot里有一个运行监视器,即Profile Monitor,专门监视程序运行中,哪一部分运用频度大,哪些对性能影响至关重要。对于那些对程序运行效率影响交大的代码,称为热点,即hot spot,HotSpot会把这些部门动态地编译成机器码,Native code,同时也对机器码进行优化(类似C编译器的一些优化),从而而提高运行效率。而那些较少运行的Code,HotSpot虚拟机就不再浪费时间把它们编译。总的来说,HotSpot对bytecode有三层处理:不编译,编译,编译并优化。
那么为什么Java采用动态编译器而不是象C++这样采用静态编译器呢?
1.虚拟机提供的跨平台运行条件。
2.Profiling。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。静态编译器虽然可以把Java全部编译成Native Code,但却做不到动态编译器那样的优化。
3.Method inlining。无论是在C还是在Java里,函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。但这一方法在Java/C++这样的面向对象的语言的编译器中,较难很好实现。那些静态编译器,通常可以把private,static等函数进行Method inlining,但由于这些面向对象的语言支持函数重载,支持dynamic binding,因此静态编译器并不知道究竟应该把函数的哪个实现给inline了。
HotSpot的动态编译,由于有对函数调用的监视,因此可以准确地知道一些环境下,那些被重载和动态识别的函数可以如何被inline到调用者那里去,因此实际上对于一些Server应用来说,可以大幅度提高效率。
了解了这些,就知道,有时候Java的程序甚至能比C程序运行还快。
分享到:
相关推荐
java动态编译的几种技术介绍。JavaCompiler --JDK6 API的简介(java动态编译)
java动态编译java源文件,并利用Instrumentation实现重定义class
java 动态编译.java文件,动态运行类
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
本代码块为动态编译指定java文件,将编译后的class生成jar文件.调用示例为BuildRmi类
java 动态编译.java文件,动态运行类 _1.2
java 动态编译.java文件,动态运行类 _1.3
Java的动态编译知识,真真在实际开发中并不是经常遇到。但是学习java动态编译有助于我们从更深一层次去了解java。对掌握jdk的动态代理模式,还有比如CGLIB,Spring 的AOP的原理就很有帮助。这样我们在学习其他一些开源...
java动态编译 ,写了一个jsp在页面上编辑java代码,然后servlet动态编译并执行main方法
java动态编译源码并调用的三种方式,全部包含在内,并且有文档说明,还是相当不错的。
java 动态编译.java文件,动态运行类 _1.1
SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机动态调整...
java 动态编译特性的展示工程勘误篇
Java 动态编译小工具。(此工具可兼容 jar in jar 的情况)。本工具的代码主要源自 arthas。
利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性的项目源码,具体详情请查看相关博客https://blog.csdn.net/qq_31142553/article/details/85013989
JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA...
后来考虑到这样编程的任务很重,时间有限 后来在网上搜搜,看到使用动态编译并使用反射机制 ,这样计算表达式的编程就容易多了. 前几天要做一个计算数学表达式的题目,本来计划使用解析表达式的方法来解析各种数学...
Java语言-动态编译代码并热加载类,js热加载
NULL 博文链接:https://zheng12tian.iteye.com/blog/1488813
动态编译可以用于实现动态代码生成、动态加载、插件化等功能。