在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程序运行还快。

posted on

2013-02-17 13:55

蜜雪薇琪

阅读(147)

评论(0)

编辑

收藏

java 动态编译 canino_java动态编译相关推荐

  1. vs可以调用java接口吗_关于vs2010下编译dll动态库,JNA接口在java中调用的问题

    最近在搞关于把vs2010中的project,使之能够在Java下面运行,有一个调用本地接口的问题,JNI那个涉及到复杂细节太多,就使用了最新的JNA(java native access) 网上也给 ...

  2. 动态编译和静态编译及Java执行

    静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了.你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了..大多数 ...

  3. android重新编译res,使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中lt;meta-datagt;变量的值...

    你也能够查看我的其它同类文章.也会让你有一定的收货 关于使用Gradle来控制版本号和生成不同版本号的代码.我总结了三篇文章,网上关于这些知识,都比較零散.我在学习这些的之前.根本不知道还有这种方法. ...

  4. netcore 编译 html dll,ASP.NET Core Razor 视图预编译、动态编译

    0x01 前言 ASP.NET Core在默认发布情况下,会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布.下面我将从 ASP.NE ...

  5. 使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中lt;meta-datagt;变量的值...

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客 你也能够查看我的其它同类文章.也会让你有一定的 ...

  6. linux gcc 静态编译,GCC 程序编译的静态链接和动态链接

    (给Linux爱好者加星标,提升Linux技能)转自:Mr_Bluyee 在链接阶段中,所有对应于源文件的 .o 文件.'-l' 选项指定的库文件.无法识别的文件名(包括指定的.o目标文件和.a库文件 ...

  7. apache的动态编译和静态编译

    静态: 在使用./configure 编译的时候,如果不指定某个模块为动态,即没有使用:enable-mods-shared=module或者enable-module=shared 这个2个中的一个 ...

  8. apache 静态编译和动态编译参考

    apache-2.2.22 编译安装笔记 一.静态编译     在使用./configure 编译的时候,即没有使用--enable-mods-shared=[module]或者--enable-[m ...

  9. ASP.NET Core Razor 视图预编译、动态编译

    0x01 前言 ASP.NET Core在默认发布情况下,会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布.下面我将从 ASP.NE ...

最新文章

  1. dubbo源码解析(三十五)集群——cluster
  2. java 强制gc_java应用性能调优之详解System的gc垃圾回收方法
  3. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
  4. jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档。
  5. CentOS+tomcat jsp笔记
  6. UncaughtExceptionHandler
  7. POJ 2593解题报告
  8. HDU3430-扩展中国剩余定理
  9. [Mac入门]如何在Mac下显示Finder中的所有文件
  10. python中iskeydown什么函数_isKeyDown不能在Java中工作
  11. 【BZOJ 4551】【TJOI2016】【HEOI2016】树
  12. 标签条码打印机开发大纲
  13. 计算机桌面桌面设置动态视频,电脑怎么设置动态桌面
  14. ab plc软件_回收拆厂拆机设备废旧设备PLC触摸屏自动化设备回收【cpu吧】
  15. 浅谈医院HIS系统审计
  16. NYOJ268 荷兰国旗问题
  17. C语言练习题之函数部分
  18. 安卓应用 .9.png类型启动图/背景图
  19. geoserver给天地图添加服务,给线加标注
  20. linux移动文件夹

热门文章

  1. 一天搞定CSS: CSS选择器优先级--08
  2. python3.8.5是python3吗_科学网-Ubuntu16.04安装Python3.8.5问题及解决方法-陈超的博文
  3. Springboot整合shiro基于url身份认证和授权认证
  4. 动图图解C语言选择排序算法,含代码分析
  5. 派生类的构造【C++继承】
  6. php实现复选框删除功能,php怎么实现复选框批量删除
  7. python如何下载zip文件_使用python-mechaniz下载zip文件
  8. caj文件浏览器_解决CAJ阅读器读取学位论文卡到爆炸的问题
  9. 看完这篇,Oracle数据库运维不用愁
  10. 硬核!OSPF路由协议归纳大全~