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. 20155209 2016-2017-2 《Java程序设计》第1周学习总结

    20155209 2016-2017-2 <Java程序设计>第1周学习总结 初读教材对每章节的提问 第一章:为什么java被广泛使用,java这样的平台相比其它语言有什么实质的好处? 第 ...

  2. 20155218 2006-2007-2 《Java程序设计》第2周学习总结

    20155218 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 java编程风格: java中没有指针的概念,尽管也有数组和对象的引用的概念,但他的管理全部 ...

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

    20155233 2016-2017-2 <Java程序设计>第9周学习总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会 ...

  4. 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd

    学习pwd命令 man pwd查看 pwd命令用于显示当前工作目录,是Linux下最常用的命令之一.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 环境变量OLDPWD表示 ...

  5. aspnetcore 2.1 发布到树莓派3linux的艰辛路程

    发布至docker for windows. 提示: image operating system "windows" cannot be used on this platfor ...

  6. WPF MVVM从入门到精通2:实现一个登录窗口

    原文:WPF MVVM从入门到精通2:实现一个登录窗口   WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 ...

  7. day 3 模块

    1.系统自带模块  xxx.py 文件 就是模块 ### 模块存放位置 In [1]: import os In [2]: os.__file__ Out[2]: '/usr/lib/python3. ...

  8. 【BZOJ3142】[HNOI2013]数列

    [BZOJ3142][HNOI2013]数列 题面 洛谷 bzoj 题解 设第\(i\)天的股价为\(a_i\),记差分数组\(c_i=a_{i+1}-a_i\) 则 \[ Ans=\sum_{c_1 ...

  9. MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 的解决方法

    解决方法如下:  方法 1.在线修改提高允许的max_connection_errors数量: A. 登录Mysql数据库查看max_connection_errors: mysql>show ...

  10. HTTP请求方式:GET和POST的比较

    GET和POST是HTTP的两个常用方法 什么是HTTP? 超文本传输协议(HyperText Transfer Prptocol-HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP ...