java hotspot 是什么_什么是HotSpot

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

积分和人民币比率_通过比率路由到旧版和现代应用程序–通过Spring Cloud的Netflix Zuul...

积分和人民币比率从应用程序的旧版本迁移到应用程序的现代化版本时,一个非常常见的要求是能够将用户缓慢迁移到新应用程序。 在本文中,我将介绍通过Spring Cloud使用对Netflix Zuul的支持编写的这种路由层。 在继续之前,我必须承认&#xff0…

Java集合类原理详解

文章目录1 集合框架1.1 集合框架概述1.1.1 容器简介1.1.1 容器的分类1.2 Collection1.2.1 常用方法1.2.2 迭代器1.3 List1.3.1 概述1.3.2 常用方法1.3.3 实现原理1.4 Map1.4.1 概述1.4.2 常用方法1.4.3 Comparable 接口1.4.4 实现原理1.4.5 覆写 hashCode()1.5 Set1.5.1 概述1.…

sql安装联机丛书提示发生网络错误_速达软件:安装问题解答

问题Q&A在安装MSDE数据库时,出现安装程序倒退的情况解决方案:这是以前装过SQL Server数据库或MSDE数据库,没有卸载干净.解决办法重装操作系统。安装MSDE数据库时,系统出现“读取文件C:\program files\Microsoft sql sever\mssql\data\msd…

java分布式系统开发_从微服务到分布式系统-Java开发人员生存指南

java分布式系统开发感觉像是对微服务的炒作正在慢慢地落到实处,并且我们的行业开始意识到,根据微服务背后的体系结构范式无法通过仅在现有组件之上公开一些HTTP接口来轻松创建一个系统。 。 我们似乎确实同意必须进行服务优化的基础架构,文化…

java 调整jvm_eclipse修改jvm参数调优方法(2种)

本文介绍了eclipse修改jvm参数调优方法(2种),分享给大家,具体如下:一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,…

python对分组进行排序_如何按排序顺序将列表中的项目分组?

由于您希望对输出进行排序,所以可以根据第一个元素对原始列表进行排序>>> first lambda x: x[0]>>> one_sorted sorted(one, keyfirst)然后您可以根据第一个元素使用^{}对元素进行分组,如下所示^{pr2}$因为您想按升序给组分配数字&a…

链表数据结构原理图/内存结构图/内存图

单项链表内存结构图(也叫原理图) 单项链表内存结构图

java web源代码_检测Java Web应用程序而无需修改其源代码

java web源代码与其他系统进行交互时,大多数Java Web应用程序都使用标准Java接口。 诸如Web页面或REST服务器之类的基于HTTP的服务是使用接口javax.servlet.Servlet来实现的。 使用JDBC接口java.sql.Statement和java.sql.Connection实现数据库交互。 这些标准几乎是…

反射与泛型 java_Java的反射 和 泛型的一个问题

aluckdog模板方法在编译过程中类型擦除:update(T,UpdateOperations)退化成update(Object,UpdateOperations);update(Query,UpdateOperations)退化成update(Query,UpdateOperations);morphia的update方法不光是一个模板方法,还是一…

迭代器原理图

原理图&#xff1a; Iterator<String> it Collection.iterator();it 是集合Collection的视图&#xff0c;迭代器其实就是视图&#xff08;类似数据库的 view&#xff09;&#xff0c;可以理解为一张单列多行的表&#xff0c;如下图所示&#xff1a; 有人理解成单行多…

neo4j python 算法_图论与图学习(二):图算法

选自towardsdatascience作者&#xff1a;Mal Fabien机器之心编译参与&#xff1a;熊猫图(graph)近来正逐渐变成机器学习的一大核心领域&#xff0c;比如你可以通过预测潜在的连接来理解社交网络的结构、检测欺诈、理解汽车租赁服务的消费者行为或进行实时推荐。近日&#xff0c…

cobol和java_现代化历险:策略+将COBOL转换为Java的示例

cobol和java在Keyhole Software&#xff0c;我们在很大程度上是一家现代化公司。 我们有一些顾问&#xff0c;专门研究将旧的代码迁移到新的&#xff0c;翻新的残旧代码库&#xff0c;并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的一个有趣的副作用&…

c# mysql sdr_C#结合数据库实现验证识别ID卡内容的方法

本文所述实例为C#结合数据库&#xff0c;来验证所识别的ID卡内容&#xff0c;通过本实例代码&#xff0c;用户可以轻松实现对ID卡会员信息的验证。该实例代码可实现读取数据库&#xff0c;进而逐步实现数据库连接&#xff0c;数据库读取&#xff0c;ID卡读取&#xff0c;ID卡信…

递归算法 流程图_什么是算法?如何学习算法?算法入门的学习路径

什么是算法&#xff1f;有一个很著名的公式 “程序数据结构算法”。曾经跟朋友吃饭的时候我问他什么是算法&#xff0c;他说算法嘛&#xff0c;就是一套方法&#xff0c;需要的时候拿过来&#xff0c;套用就可以&#xff0c;我吐槽他&#xff0c;他说的是小学数学题的算法&…

java webmethod 参数_java详解Spring接收web请求参数的方式

本篇文章给大家带来的内容是java详解Spring接收web请求参数的方式 。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。1 查询参数请求格式&#xff1a;url?参数1值1&参数2值2...同时适用于GET和POST方式spring处理查询参数的方法又…

envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试

envoy重试该博客是系列文章的一部分&#xff0c;该系列文章更深入地介绍了Envoy Proxy和Istio.io &#xff0c;以及它如何实现一种更优雅的连接和管理微服务的方式。 跟随我christianposta &#xff0c;紧跟这些博客文章的发布。 什么是Envoy代理 &#xff0c;它如何工作&…

python中字符串格式化的形式_Python中format函数字符串格式化入门

格式化在程序开发中非常常见&#xff0c;大家肯定不陌生&#xff0c;Python中也存在多重格式化方式&#xff0c;format函数就是其中一种。函数原型format(value[, format_spec])参数意义value&#xff1a; 需要被格式化的字符串format_spec&#xff1a; 格式化的格式函数定义与…

Java的超类/基类Object

文章目录简介主要方法equals简介 所有的类都继承了 Object&#xff0c;即 Object 是所有类的父类&#xff0c;所以所有的 Java 类都继承了 Object 的所有方法。 比如你写一个类如下&#xff1a; public class Question { ... }实际上这个类是继承自 Object 的&#xff0c;默…

网络研讨室_即将举行的网络研讨会:调试生产中Java的5种最佳实践

网络研讨室您的团队是否花费超过10&#xff05;的时间在生产中调试Java&#xff1f; 将新代码部署到生产中是一项艰巨的任务。 在您的本地环境中起作用的东西在生产中的作用并不相同&#xff0c;您可以通过用户来了解。 不理想吧&#xff1f; 生产中的调试是一个关键要素&…

window部署python项目_Django在Window下的部署

转载 : codingsoho.com前言本文主要介绍利用apache去部署Django项目&#xff0c;所有步骤均在本机Window7和阿里云验证通过。配置本例的基本配置如下&#xff1a;工作目录&#xff1a; C:/virtualenv/zakkabag项目名称&#xff1a; zakkabag最终的安装版本如下&#xff0c;后面…