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. 20155310《Java程序设计》实验五(网络编程与安全)实验报告

    20155310<Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 •任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上 ...

  2. 再装虚拟机及git

    再装虚拟机及git 问题1:在假期的学习中并没有上传代码的习惯,到了开学要用到的时候发现新建的目录无法git到码云上,当时也没有在意,直到老师问我要代码链接才意识到这个问题. 问题2:在按照老师的博客 ...

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

    教材学习内容总结 第一章 Java平台概论 学习目标 Java版本迁移简介 认识Java SE.Java EE.Java ME 了解JVM.JRE与JDK 下载与安装JDK 章节主要内容 第二章 从J ...

  4. mongodb在我这个C#下手眼中-01初识

    虽然不是技术大牛,但是组长推荐看一下,而且我们正在做的项目,类似于资源中心,牵扯到各种怪异数据类型不同分库,所以至今都是采用这种方式:①MainData表存所有值,变化最大的分库数据用json存储②j ...

  5. 洛谷 P3369 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  6. 润乾报表整合到Tomcat服务器的部署过程

    转载自:http://www.cnblogs.com/avivaye/archive/2012/11/16/2773681.html 使用第三方的报表设计器/服务器来快速的开发报表. 润乾服务器是使用 ...

  7. linux-ubuntu常用命令(深圳文鹏)

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  8. 创建oracle数据表示例sql

    CREATE TABLE "BRAND_RELATION"    (        "ID" NUMBER(10,0) NOT NULL ENABLE,    ...

  9. NO--09今天遇到的一点小问题之axios全局注册

    今天用 Vue 写项目的时候,用到 axios ,因为 axios 不能用 Vue.use() ,所以在每个 .vue 文件中使用 axios 时就需要 import , .vue 文件少的话还好说, ...

  10. IDEA 破解图文教程 - 2018.9 更

    你好!这里是你要找的 IDEA 破解方法 目录     一.前言    二.IDEA 安装         2.1 下载IDEA 旗舰版         2.2 开始安装         2.3 自定 ...