什么是HotSpot
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的更多相关文章
- HotSpot JVM常用参数设置
转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...
- 转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析
重点 应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化. 分层编译由五层编译构成. 分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化. 提供即时编译相关诊断信息的JV ...
- HSDB - HotSpot debugger
HSDB 是专门用于调试 HotSpot VM 的调试器,它是一个图形化界面.与之对应的还有个 CLHSDB-Command Line HotSpot Debugger,命令行调试界面.下面是启动命令 ...
- 关于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 ...
- HotSpot虚拟机对象介绍
1.对象的创建 Java是一门面向对象语言,在运行过程中无时不刻不在创建对象.从语言层面,创建对象仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象仅限于普通java对象,不包含数组和Cl ...
- Hotspot内存溢出测试
一.堆溢出 在执行代码时通过设置堆的最小值-Mms以及堆的最大值-Mmx来控制堆的大小,-XX参数dump出堆内存快照以便对内存溢出进行分析.通过创建大量对象来使堆溢出,当堆内存溢出时会提示OutOf ...
- ROS Hotspot服务器的搭建与设定!(上网认证)
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:由于Hotspot设定的步骤比较多,此文档只讲解如何设定Hotspot的方法,关于ROS的安装与路由上网的配置请自行百度查阅. ...
- 6.HotSpot垃圾收集器
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. 并发和并行 先解释下什么是垃圾收集器的上下文语境 ...
- 5.HotSpot的算法实现
1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受. 而且,可达性分析必须在一个一致性的快照中进行-即 ...
- 在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...
随机推荐
- 20155220 2016-2017-2 《java程序设计》第四周总结
教材学习内容总结 第六章 继承与多态 继承 继承的基本原则是: 子类继承父类的所有成员变量(包括静态成员): 子类继承除父类构造方法外的所有成员方法(包括静态方法): 子类不能继承父类的构造方法,但在 ...
- Spring SimpleJdbcOperations 批量更新
1.控制台代码 import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowM ...
- 深入解析QML引擎, 第4部分: 自定义解析器
原文 QML Engine Internals, Part 4: Custom Parsers ——————————————————————————————————————————— 上一篇 绑定类型 ...
- devpi 快速入门:上传,测试,推送发行版
安装 devpi 客户端和服务器端 pip install -U devpi 这将安装devpi-client,devpi-server 和 devpi-web 三个Python PyPi包. 初始化 ...
- 自动化之UI(autoit)
自动化 说到自动化,我真的很不喜欢UI这层去做实践.前置条件要求比较严谨,如果不满足特定的前置条件,那么成本实在太大了. 投入与产出差过大,效果打折扣.从互联网来说,UI自动化是入门门槛很低的一种实践 ...
- 【洛谷】题解 P1056 【排座椅】
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...
- Lua学习笔记(4): 字符串
Lua的字符串有3种初始化方式 str = "2333" str = 'hahahaha' str = [[ruarua]] 其中单引号和双引号的初始化方式并无区别,[[]]双中括 ...
- Siki_Unity_3-16_3D数学基础
Unity 3-16 3D数学基础 任务0-1:课程介绍 课程大纲: 1. 3D数学介绍 2. Unity中的几种坐标系: 全局坐标系.屏幕坐标系等 坐标系间的坐标转换:比如屏幕坐标转换到世界坐标 3 ...
- LeeCode_01_Two sum
Two Sum Given an array of integers, return indices of the two numbers such that they add up to a spe ...
- PLSQL变量和类型,流程控制语句,集合
---PLSQL 调试授权 GRANT debug any procedure, debug connect session TO scott; --定义变量 declare part_number ...