关于HotSpot VM以及Java语言的动态编译 你可能想知道这些

目录

  • 1 HotSpot VM的历史
  • 2 HotSpot VM 概述
    • 2.1 编译器
    • 2.2 解释器
    • 2.3 解释型语言 VS 编译型语言
  • 3 动态编译
    • 3.1 什么是动态编译
    • 3.2 HotSpot VM对字节码的处理方式
    • 3.3 为什么不静态编译

1 HotSpot VM的历史

SUN/Oracle JDK中使用的JVM是HotSpot VM.

SUN JDK从1.3.1版本开始采用HotSpot虚拟机, 并于2006年底开源, 主要使用C++实现, JNI接口部分用C实现.

HotSpot是比较新的JVM, 用来替代JIT (Just in Time, 即时编译), 可以大大提高Java的运行性能 —— 通过下述方法提高性能:

Java起初是将源代码编译class字节码在虚拟机上执行, 速度较慢;

HotSpot将常用的部分代码编译为本地(native)代码, 显著提高性能.

HotSpot JVM参数分为标准参数(standard options)、非标准参数(non-standard options) 以及非稳定参数, 可参考: 关于JVM的垃圾回收(GC) 这可能是你想了解的 中4.1 参数名称的说明.

2 HotSpot VM 概述

1438655-20181002113058349-1560559696.jpg

HotSpot包括一个解释器和两个编译器(client和server, 实际运行中选择其一即可, 大多选择server), 解释与编译混合执行模式, 默认启动解释执行.

server模式下应用程序启动较慢, 占用内存多, 但执行效率高, 其适用于服务器端需要长期执行的应用;
client模式下应用程序启动较快, 占用内存小, 但执行效率较低, 默认情况下不进行动态编译, 适用于桌面应用程序.

(1) 查看 JVM 的启动模式:

# 使用解释与编译混合的模式
java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
# mixed mode 解释与编译混合的模式, 是默认使用的模式. 
# 使用纯解释模式
java -Xint -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
# interpreted mode 纯解释模式, 即禁用JIT编译. 
# 使用纯编译模式
java -Xcomp -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, compiled mode)
# compiled mode 纯编译模式, 如果方法无法编译, 则回退到解释模式执行无法编译的方法. 

2.1 编译器

Java源代码被编译器编译成class字节码文件, 字节码在运行时可以被动态编译(JIT)成本地代码, 前提是解释与编译混合执行模式且虚拟机不是刚启动.

2.2 解释器

解释器用来解释class字节码文件, Java是解释型语言(区别于编译型语言).

2.3 解释型语言 VS 编译型语言

计算机不能直接理解执行高级语言, 只能直接执行机器语言, 所以必须将高级语言翻译成机器语言再执行.

翻译的方式有两种 —— 编译和解释, 两者只是翻译的时间不同:

① 解释型语言: 不需要提前翻译 —— 例如Java语言, 在运行时才翻译, 再由专门的解释器解释执行 —— 每执行一次就要翻译一次, 效率较低.

优点: 可移植性好, 只要有解释环境, 就可以在不同的操作系统上运行. 比如在解释执行时可以动态改变变量的类型、修改程序以及在程序中插入良好的调试诊断等信息, 将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。

缺点: 运行需要解释环境, 运行速度较慢, 占用的资源更多 —— 因为不仅要为用户程序分配空间, 解释器本身也要占用一定的系统资源. 其封装了底层代码, 程序严重依赖平台, 不能同C++那样直接操作底层.

代表: 一些网页脚本、服务器脚本等对速度要求不高, 却对不同系统平台间的兼容性有要求的程序通常使用解释性语言, 如Java、JavaScript、Perl、Python、Ruby、MATLAB等.

② 编译型语言: 编写的程序在运行前, 需要通过编译器将代码编译成机器语言(二进制文件), 然后直接由相应的操作系统执行.

编译和执行是分开的, 但不能跨平台. 例如 C++ 编译成的 exe 文件, 运行时不需再次编译, 直接使用编译的结果即可 —— 效率较高.

因为不同的操作系统识别的二进制文件是不同的, 所以编译型语言的程序在移植后, 需要重新编译(如Windows下的C程序编译成exe文件, Linux下要编译成erp文件).

优点: 运行速度快, 代码效率高, 同等条件下对系统要求较低.

缺点: 代码需要经过编译才能运行, 可移植性差 —— 只能在兼容的操作系统上运行.

代表: 像开发操作系统、大型应用程序、数据库系统等时都使用编译型语言, 如C、C++、Pascal等.

3 动态编译

3.1 什么是动态编译

动态编译 (compile during run-time), 英文称 Dynamic compilation, Just In Time (即时编译) 也有此意.

HotSpot VM对字节码的编译不是在程序运行前, 而是在程序运行过程中编译的.

HotSpot VM中有一个监视器 (Profile Monitor), 用来监视程序的运行状况.

Java字节码 (class文件) 是以解释的方式被加载到虚拟机中 (默认启动时就解释执行), 程序运行过程中, 使用频率高、对程序的性能影响重要的代码, 称之为热点 (hotspot), HotSpot VM会把这些热点动态地编译成机器码 (native code), 同时对机器码进行优化, 从而提高运行效率. 对使用频率较低的代码, HotSpot VM就不会编译.

比如指令的重排序, 使用volatile关键字可以禁止重排序等类似的操作都是在这个编译阶段进行的.

3.2 HotSpot VM对字节码的处理方式

① 不编译: 字节码加载到虚拟机中时的状态, 也就是虚拟机执行时再编译;

② 编译: 把字节码编译成本地代码, 虚拟机执行时已经编译好了, 无需再次编译;

③ 编译并优化: 不但把字节码编译成本地代码, 而且还进行了优化.

具体如何处理, 都是由监视器 (Profile Monitor) 决定的.

3.3 为什么不静态编译

为什么不采取将字节码直接变异成本地代码, 然后再装载到虚拟机中?

① 动态编译器在许多方面比静态编译器优越 —— 静态编译器通常很难预知程序运行过程中最需要优化的代码.

② 函数调用是很浪费系统时间的, 因为有许多进出栈操作. 因此有一种优化办法, 就是把原来的函数调用通过编译, 改为非函数调用 —— 将函数代码直接嵌到调用的地方, 变为顺序执行.

③ 面向对象的语言支持多态, 静态编译无法确定程序调用的到底是超类的哪些实现子类的方法, 因为多态是在程序运行中才能具体确定的.

参考资料

OpenJDK和Sun/OracleJDK 区别 与联系

【Language】解释性语言和编译型语言的区别和不同

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

转载于:https://www.cnblogs.com/shoufeng/p/9736148.html

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

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

相关文章

马斯克向中国保证

来源:金融时报美国当地时间3月20日,特斯拉公司(Tesla Inc.)首席执行官埃隆马斯克 (Elon Musk)通过网络参加中国发展高层论坛会议。马斯克在会议上表示,特斯拉公司将不会向美国政府提供其车辆在中…

对抗攻击层出不穷?神经科学带来新突破、导出智能统一框架,Hinton:我早有洞见

来源 :AI科技评论编译 :bluemin校对 :青暮最近的神经科学研究指出了如何击败对抗性示例,并为实现更具弹性、一致性和灵活性的人工智能指明了道路。对抗性示例是当今深度学习研究的热点。数据中微妙的,通常是无形的更改…

增强现实系统的三大关键技术是什么?

来源:VR村增强现实系统的主要任务是进行真实世界和虚拟物体的无缝融合,需要解决真实场景和虚拟物体的合成一致性问题。为了确保真实世界和虚拟对象的无缝融合,根据Ronald Azuma对增强现实技术的定义,在AR应用系统开发中必须要解决…

51 Nod 1116 K进制下的大数

1116 K进制下的大数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数。现在由你…

数字化?智能化?中国企业智能制造现状究竟如何 李炳积 工信头条 昨天

来源:先进制造业各国智能制造现状30年来,在智能制造领域,各国从早期侧重于智能设计的数值模型和离线模型,发展到以智能制造过程优化为目标在线智能系统,从传统行业进军新兴行业。欧美技术基础较好,对高端技…

2021年MEMS传感器产业链变化与趋势

来源:宸元资本一MEMS基本概念和相关产业政策MEMS基本概念微机电系统(MEMS, Micro-Electro-Mechanical System),也叫做微电子机械系统、微系统、微机械等,指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般…

python基础之流程控制

python流程控制 python的流程控制跟大多数的语言一样,包括if条件语句、for循环语句、while循环语句;跳出循环continue,break等 写在前面 python中的运算 1)算数运算 以下假设变量:a10,b20: 2&am…

从自动驾驶汽车开始,机器学习开始与物理世界交互

大数据文摘出品来源:Wired编译:王烨今天,有许多人工智能与我们互动的例子,使我们的生活的效率更高。智能体向我们通过电子商务网站向我们推荐产品,通过社交媒体为我们推荐新闻,通过交友应用向我们推荐朋友&…

突破!在人工染色体中存储图片和视频:天津大学元英进团队验证DNA数据存储新方法...

来源:中国生物技术网天津大学元英进教授团队从头编码设计合成了一条长度为254,886 bp、专用于数据存储的酵母人工染色体,借助无线通信中前沿的纠错编码将两张经典图片和一段视频存储于高效组装的人造染色体,利用酵母繁殖实现了数据稳定复制&a…

10分钟 在linux里创建.net core helloworld控制台程序

官方教程 安装linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :选择和你本机适用的Linux版本,我这里用的是18.04. 第二步 :注册秘钥,产品仓储,以及安装依赖项,每台机器只需要注册一次&a…

陈天桥雒芊芊脑机接口中心等团队研究登顶刊:超声波“读心”

来源:澎湃新闻 作者:贺梨萍 脑机接口(BMIs)在全球的研究正如火如荼,神经科学家们希望通过这样一种设备将神经活动映射到相应的行为,它以读取和解释大脑活动,并向计算机或机器发送指令。实际上&a…

图灵奖得主 Yann LeCun 最新文章 :自监督学习,人工智能世界的“暗物质”

来源:AI前线作者:Yann LeCun ,Ishan Misra译者:王强策划:刘燕近年来,AI 产业在开发“可以从大量经过细致标记的数据中学习的 AI 系统”这个研究领域上取得了巨大进步。这种监督学习的范式在训练专业模型方面…

无脑人:我们真的需要大脑吗?

© Mental Floss来源:神经科技编辑:Yezi审阅:mingzlee7在一次讨论中,有位德高望重的人(我不会透露这个人是谁)告诉我:“我认为自我存在于心脏!而不是大脑!那些声称意…

JS数组的需要注意的问题

一、在js中数组是我们经常使用的数据类型,也为我们提供了很多方法。但是有些方法需要注意使用: 1、indexOf(args):匹配一个数组中与args相等的项的索引位置,如果该数组包含这个匹配项则返回第一个匹配的索引,并停止匹配…

基金委最新改革:9大科学部整合为4个板块资助布局

来源:微信公众号科学网(sciencenet-cas)3月24日,国家自然科学基金委员会(以下简称自然科学基金委)第八届委员会第四次全体会议在北京召开。会议上,自然科学基金委主任、党组书记李静海作全委会工…

Leetcode--236. 二叉树的最近公共祖先(Java)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的…

万恶之源 - Python运算符与编码

格式化输出 现在有个需要我们录入我们身边好友的信息,格式如下: ------------ info of Alex Li ----------Name : Alex LiAge : 22job : Teacher Hobbie: girl------------- end ---------------- 我们现在能想到的办法就是用一下方法: name input(请输入姓名:) age …

世界最大、最复杂的GPU!这颗集成1000亿个晶体管的芯片长什么样?

来源:EETOP3月25日消息 英特尔于昨日举办了直播活动,新上任的 CEO 帕特基辛格(Pat Gelsinger) 发表了演讲,并展示了采用 7nm 工艺的 Xe-HPC 高性能 GPU,代号 “Ponte Vecchio”。这款产品封装了 47 个芯片&…

Lucene全文检索

目录结构: 1.全文检索 2.Lucene入门 3.Lucene进阶 全文检索 一, 生活中的搜索: 1.Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹。搜索的范围是整个电脑中的文件资源。 2.Eclipse中的帮助…

区块链架构下 智慧城市发展加速

来源:中国经济时报智慧城市与区块链技术结合愈加紧密在城市建设和管理上,越来越多的城市开始尝试推动区块链技术在智慧城市项目中应用。中国有杭州聚能城、雄安新区;韩国有“区块链首尔城”;瑞士有“加密谷”楚格;爱沙尼亚和圣马力诺等国家也在纷纷构筑自…