Java 是动态编译,跟C++静态编译不同,这就是JIT编译器的原因(Just In Time)

HotSpot会把这些部门动态地编译成机器码,Native code, 并对机器码进行优化,

静态编译器通常很难准确 预知程序运行过程中究竟什么部分最需要优化。静态编译器虽然可以把Java 
全部编译成Native Code,但却做不到动态编译器那样的优化。 

没错,Java是解释语言,但并不意味着它一定被解释执行。早期 
的虚拟机确实一条一条指令解释执行,但人们发现这样效率太低, 
不满足各种要求,因此出现了许多其它虚拟机,如JIT的虚拟机。 
HotSpot也是类似一种虚拟机,自从SUN买下后,已经把它放入 
JRE 1.3以及后续版本中。 
 
采用HotSpot的Java虚拟机,已经很难说Java是被虚拟机解释执行了, 
原因是HotSpot实际上是把Java的bytecode编译成Native code, 
然后运行。 
 
实际上在HotSpot虚拟机中,有两个技术是至关重要的,即动态编译和 
Profiling。HotSpot对bytecode的编译,不是在程序运行前预先编译的, 
而是在程序运行过程中,动态编译(compile during run-time),英文称 
Dynamic compilation。其实Just In Time也就是这个意思。 
 
HotSpot是如何动态编译Javad的bytecode呢?它采用的是一种smart的办法。 
HotSpot里有一个运行监视器,即Profile Monitor(不知国内如何翻译Profile), 
专门监视程序运行中,哪一部分运用频度大, 哪些对性能影响至关重要。 
当然Profile Monitor有一些算法,这些算法未必十全十美,但大体是能较好 
获得相关信息的。对于那些对程序运行效率影响交大的代码,称为热点, 
即hot spot,HotSpot会把这些部门动态地编译成机器码,Native code, 
同时也对机器码进行优化(类似C编译器的一些优化),从而而提高运行效率。 
而那些较少运行的Code,HotSpot虚拟机就不再浪费时间把它们编译。 
 
总体来看,Java bytecode是以解释方式被load到虚拟机的。但虚拟机的 
分析器根据一段运行,获知对程序效率影响最大的部分,然后通过动态 
编译,同时进行优化,编译成机器码,然后为接下来的运行加速。总的 
来说,HotSpot对bytecode有三层处理:不编译,编译,编译并优化。 
至于程序哪部分不编译,哪部分编译,哪部分做何种优化,则由Profile 
Monitor决定。 
 
那么为什么Java采用动态编译器而不是象C++这样采用静态编译器呢? 
虚拟机提供的跨平台运行条件固然是一方面,动态编译器也在许多方面 
比静态编译器优越。Profiling就是一个例子。静态编译器通常很难准确 
预知程序运行过程中究竟什么部分最需要优化。静态编译器虽然可以把Java 
全部编译成Native Code,但却做不到动态编译器那样的优化。 
 
另一个典型的例子,叫做Method inlining。我们知道无论是在C还是在 
Java里,函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。 
因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成 
非函数调用,把函数代码直接嵌到调用出,变成顺序执行。 
 
但这一方法在Java/C++这样的面向对象的语言的编译器中,较难很好实现。 
那些静态编译器,通常可以把private,static等函数进行Method inlining, 
但由于这些面向对象的语言支持函数重载,支持动态联编(不知道是不是这样 
翻译,Overridden, dynamic binding),因此静态编译器并不知道究竟应该 
把函数的哪个实现给inline了。 
 
HotSpot的动态编译,由于有对函数调用的监视,因此可以准确地知道一些环境 
下,那些被重载和动态识别的函数可以如何被inline到调用者那里去,因此 
实际上对于一些Server应用来说,可以大幅度提高效率。 
 
HotSpot实际上有两个版本,一个是Server版,一个是Client版。但它们的结构 
和本质都是一样的,只是有些地方优化不一样。 
 
了解了这些,就知道,有时候Java的程序甚至能比C程序运行还快。

什么是HotSpot

什么是HotSpot的更多相关文章

  1. HotSpot JVM常用参数设置

    转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...

  2. 转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析

    重点 应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化. 分层编译由五层编译构成. 分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化. 提供即时编译相关诊断信息的JV ...

  3. HSDB - HotSpot debugger

    HSDB 是专门用于调试 HotSpot VM 的调试器,它是一个图形化界面.与之对应的还有个 CLHSDB-Command Line HotSpot Debugger,命令行调试界面.下面是启动命令 ...

  4. 关于Linux x64 Oracle JDK7u60 64-bit HotSpot VM 线程栈默认大小问题的整理

    JVM线程的栈默认大小,oracle官网有简单描述: In Java SE 6, the default on Sparc is 512k in the 32-bit VM, and 1024k in ...

  5. HotSpot虚拟机对象介绍

    1.对象的创建 Java是一门面向对象语言,在运行过程中无时不刻不在创建对象.从语言层面,创建对象仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象仅限于普通java对象,不包含数组和Cl ...

  6. Hotspot内存溢出测试

    一.堆溢出 在执行代码时通过设置堆的最小值-Mms以及堆的最大值-Mmx来控制堆的大小,-XX参数dump出堆内存快照以便对内存溢出进行分析.通过创建大量对象来使堆溢出,当堆内存溢出时会提示OutOf ...

  7. ROS Hotspot服务器的搭建与设定!(上网认证)

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:由于Hotspot设定的步骤比较多,此文档只讲解如何设定Hotspot的方法,关于ROS的安装与路由上网的配置请自行百度查阅. ...

  8. 6.HotSpot垃圾收集器

    HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. 并发和并行 先解释下什么是垃圾收集器的上下文语境 ...

  9. 5.HotSpot的算法实现

    1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受. 而且,可达性分析必须在一个一致性的快照中进行-即 ...

  10. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...

随机推荐

  1. 20155213 实验一《Java开发环境的熟悉》实验报告

    20155213 实验一<Java开发环境的熟悉>实验报告 一. 实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 输入cd Code进入Code文件夹里 ...

  2. 20155232 2016-2017-3 《Java程序设计》第10周学习总结

    20155232 2016-2017-3 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通 ...

  3. 2017-2018-1 20155307 《信息安全系统设计基础》第十周课上未完成补充以及课下IPC作业

    课上内容2:stat命令的实现-mysate 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云 ...

  4. 使用三层交换机实现不同vlan的互通

    如下拓扑图所示,要实现vlan10(192.168.10.0/24)与vlan 20(192.168.20.0/24)的网络互通. 三层交换机配置: 创建vlan:Switch#configure t ...

  5. 解决Extjs有IE下z-index属性的问题

    在用Extjs时,有时候,在Google浏览器上面没有任何问题,但是相同的页面在IE下面就会有问题,直接报错,点击中断,进行后可以看到如下的信息: Google里面没这个问题,加一句代码就能解决在窗体 ...

  6. webgl 包围盒子

    包围盒子是鼠标选择物体的一种实现方式,当从相机出发,经过鼠标点形成的射线和物体的包围盒子相交时,就代表物体被选中

  7. Android错误:can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] 已解决

    错误: can not get file data of lua/start_v2.op [LUA ERROR] [string "require "lua/start_v2””] ...

  8. 第三次ScrumMeeting博客

    第三次ScrumMeeting博客 本次会议于10月27日(五)22时整在3公寓725房间召开,持续10分钟. 与会人员:刘畅.方科栋.窦鑫泽.张安澜. 1. 每个人的工作(有Issue的内容和链接) ...

  9. git blame 查看某行代码提交记录

    1. 在当前git项目目录下执行 git blame -L 38,38 <filename> 例子:  git blame -L 38,38 src/component/BarCode/i ...

  10. 15 分钟用 ML 破解一个验证码系统

    人人都恨验证码——那些恼人的图片,显示着你在登陆某网站前得输入的文本.设计验证码的目的是,通过验证你是真实的人来避免电脑自动填充表格.但是随着深度学习和计算机视觉的兴起,现在验证码常常易被攻破. 我拜 ...