java 动态编译
来源:互联网 发布:nodejs nginx 部署 编辑:程序博客网 时间:2024/06/06 02:02
在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应用来说,可以大幅度提高效率。
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程序运行还快。
转载自:http://olive6615.iteye.com/blog/1759359
0 0
- java 内存编译-动态编译
- 动态编译JAVA程序
- 动态编译Java程序
- 动态编译JAVA程序
- JAVA动态编译简介
- 动态编译JAVA程序
- 动态编译JAVA程序
- Java动态编译
- Java的动态编译
- Java动态编译
- JAVA 的动态编译
- Java动态编译
- Java动态编译
- JAVA动态编译
- java动态编译
- Java动态编译笔记
- Java动态编译(一)
- 动态编译Java源文件
- Warning: $HADOOP_HOME is deprecated解决方法
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
- android Monkey测试
- 【黑马程序员】---- Java 基础之 学习使用API文档
- Android中应用的字体Typeface的设置
- java 动态编译
- SPOJ NUMOFPAL - Number of Palindromes 水题 (Palindromic Tree 练习)
- [github] github入手教程
- 设计模式之单例模式(C++)
- CountDownLatch的使用方法
- iphone常用控件之UIScrollView
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- poj 3667
- 队列