一、Java虚拟机概述与JVM结构
一、虚拟机与Java虚拟机
1、字节码
我们平时说的Java字节码,指的是用Java语言编译成的字节码。准确的说任何能在JVM平台上执行的字节码格式都是一样的。所以应该统称为:
jvm字节码
不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。
2、虚拟机
1、所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为
系统虚拟机
和程序虚拟机
。
系统虚拟机如(Visual Box,VMware),它们
完全是对物理计算机的仿真
,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是Java虚拟机,它
专门为执行单个计算机程序而设计
,在Java虚拟机中执行的指令我们称为Java字节码指令。2、无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
3、Java虚拟机
1、Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
2、JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
3、
Java技术的核心就是Java虚拟机
(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。4、作用:
Java虚拟机就是二进制字节码的运行环境
,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。5、特点:
一次编译,到处运行
自动内存管理
自动垃圾回收功能
二、JVM结构
1、JVM的位置
JVM是运行在操作系统之上的,它与硬件没有直接的交互。
Java的体系结构:
2、JVM整体结构
HotSpot VM是目前市面上高性能虚拟机的代表作之一。
它采用解释器与即时编译器并存的架构。
在内存中多线程共享方法区和堆;栈、方法栈、程序计数器是每个线程独有一份的。
执行引擎包含三部分:解释器,及时编译器,垃圾回收器。
3、Java代码执行流程
Java源文件,经过编译生成字节码文件,字节码文件进行解释执行,运行在操作系统上的JVM中。
4、JVM的架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。具体来说:这两种架构之间的区别:
基于栈式架构的特点:
设计和实现更简单,适用于资源受限的系统;
避开了寄存器的分配难题:使用零地址指令方式分配。
指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,指令多,编译器容易实现。
不需要硬件支持,可移植性更好,更好实现跨平台。
执行性能比寄存器差。
基于寄存器架构的特点:
典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。
指令集架构则完全依赖硬件,可移植性差。
性能优秀和执行更高效。
花费更少的指令去完成一项操作。
在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。
基于栈的计算流程:
/*** 计算2+3的值,然后查看一下字节码的反编译后的结果*/
public class Test1 {public static void main(String[] args) {int i = 2;int j = 3;int k = i + j;}
}
# 进入到编译好的文件夹下,找到编译后的class文件,使用下列命令进行反编译
javap -v Test1.class
public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=4, args_size=10: iconst_2 # 常量2入栈1: istore_1 # 保存在索引为1的位置2: iconst_3 # 常量3入栈3: istore_2 # 保存在索引为2的位置4: iload_1 # 加载进去5: iload_26: iadd # 做一个求和操作7: istore_3 # 保存在索引为3的位置8: returnLineNumberTable:line 9: 0line 10: 2line 11: 4line 12: 8LocalVariableTable:Start Length Slot Name Signature0 9 0 args [Ljava/lang/String;2 7 1 i I4 5 2 j I8 1 3 k I
基于寄存器的计算流程:
mov eax,2 //将eax寄存器的值设为2
add eax,3 //使eax寄存器的值加3
总结:
由于跨平台性的设计,Java的指令都是根据栈来设计的。
不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
5、JVM的生命周期
1、虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
2、虚拟机的执行
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
程序开始执行时它才运行,程序结束时它就停止。
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
3、虚拟机的退出有如下的几种情况
程序正常执行结束。
程序在执行过程中遇到了异常或错误而异常终止。
由于操作系统出现错误而导致Java虚拟机进程终止。
某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况。
三、JVM发展历程
1、Sun Classic VM
早在1996年Java1.0版本的时候,Sun公司发布了一款名为sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。
这款虚拟机内部只提供解释器。现在还有及时编译器,因此效率比较低,而及时编译器会把热点代码缓存起来,那么以后使用热点代码的时候,效率就比较高。
如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
现在hotspot内置了此虚拟机。
2、Exact VM
为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。
Exact Memory Management:准确式内存管理
也可以叫Non-Conservative/Accurate Memory Management
虚拟机可以知道内存中某个位置的数据具体是什么类型。|
具备现代高性能虚拟机的维形
热点探测(寻找出热点代码进行缓存)
编译器与解释器混合工作模式
只在solaris平台短暂使用,其他平台上还是classic vm,英雄气短,终被Hotspot虚拟机替换
3、HotSpot VM
HotSpot历史
最初由一家名为“Longview Technologies”的小公司设计
1997年,此公司被sun收购;2009年,Sun公司被甲骨文收购。
JDK1.3时,HotSpot VM成为默认虚拟机
目前Hotspot占有绝对的市场地位,称霸武林。
不管是现在仍在广泛使用的JDK6,还是使用比例较多的JDK8中,默认的虚拟机都是HotSpot
Sun/oracle JDK和openJDK的默认虚拟机
从服务器、桌面到移动端、嵌入式都有应用。
名称中的HotSpot指的就是它的热点代码探测技术。
通过计数器找到最具编译价值代码,触发即时编译或栈上替换
通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡
4、BEA的JRockit
专注于服务器端应用
它可以不太关注程序启动速度,因此
JRockit内部不包含解析器实现
,全部代码都靠即时编译器编译后执行。大量的行业基准测试显示,
JRockit JVM是世界上最快的JVM
。
使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了70%)和硬件成本的减少(达50%)。
优势:全面的Java运行时解决方案组合
JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
MissionControl服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。
2008年,JRockit被oracle收购。
oracle表达了整合两大优秀虚拟机的工作,大致在JDK8中完成。整合的方式是在HotSpot的基础上,移植JRockit的优秀特性。
5、IBM的J9
全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9
市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM广泛用于IBM的各种Java产品。
目前,
有影响力的三大商用虚拟机之一
,也号称是世界上最快的Java虚拟机。2017年左右,IBM发布了开源J9VM,命名为openJ9,交给EClipse基金会管理,也称为Eclipse OpenJ9
OpenJDK -> 是JDK开源了,包括了虚拟机
6、KVM和CDC / CLDC Hotspot
oracle在Java ME产品线上的两款虚拟机为:CDC/CLDC HotSpot Implementation VM KVM(Kilobyte)是CLDC-HI早期产品。
目前移动领域地位尴尬,智能机被Angroid和ioS二分天下。
KVM简单、轻量、高度可移植,面向更低端的设备上还维持自己的一片市场
智能控制器、传感器
老人手机、经济欠发达地区的功能手机
所有的虚拟机的原则:一次编译,到处运行。
7、Azul VM
前面三大“高性能Java虚拟机”使用在通用硬件平台上这里Azu1VW和BEALiquid VM是
与特定硬件平台绑定、软硬件配合的专有虚拟机
高性能Java虚拟机中的战斗机。
Azul VM是Azu1Systems公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的ava虚拟机。
每个Azu1VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、专有硬件优化的线程调度等优秀特性。
2010年,AzulSystems公司开始从硬件转向软件,发布了自己的Zing JVM,可以在通用x86平台上提供接近于Vega系统的特性。
8、Liquid VM
高性能Java虚拟机中的战斗机。
BEA公司开发的,直接运行在自家Hypervisor系统上
Liquid VM即是现在的JRockit VE(Virtual Edition),
Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如线程调度、文件系统、网络支持等。
随着JRockit虚拟机终止开发,Liquid vM项目也停止了。
9、Apache Marmony
Apache也曾经推出过与JDK1.5和JDK1.6兼容的Java运行平台Apache Harmony。
它是IBM和Intel联合开发的开源JVM,受到同样开源的openJDK的压制,Sun坚决不让Harmony获得JCP认证,最终于2011年退役,IBM转而参与OpenJDK
虽然目前并没有Apache Harmony被大规模商用的案例,但是它的Java类库代码吸纳进了Android SDK。
10、Micorsoft JVM
微软为了在IE3浏览器中支持Java Applets,开发了Microsoft JVM。
只能在window平台下运行。但确是当时Windows下性能最好的Java VM。
1997年,sun以侵犯商标、不正当竞争罪名指控微软成功,赔了sun很多钱。微软windowsXPSP3中抹掉了其VM。现在windows上安装的jdk都是HotSpot。
11、Taobao JVM
由AliJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
基于openJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。
基于openJDK Hotspot VM发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机。
创新的GCIH(GCinvisible heap)技术实现了off-heap,
即将生命周期较长的Java对象从heap中移到heap之外,并且Gc不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升Gc的回收效率的目的。
GCIH中的
对象还能够在多个Java虚拟机进程中实现共享
使用crc32指令实现JvM intrinsic降低JNI的调用开销
PMU hardware的Java profiling tool和诊断协助功能
针对大数据场景的ZenGc
taobao vm应用在阿里产品上性能高,硬件严重依赖inte1的cpu,损失了兼容性,但提高了性能
目前已经在淘宝、天猫上线,把oracle官方JvM版本全部替换了。
12、Dalvik VM
谷歌开发的,应用于Android系统,并在Android2.2中提供了JIT,发展迅猛。
Dalvik VM只能称作虚拟机,而不能称作“Java虚拟机”,它没有遵循 Java虚拟机规范
不能直接执行Java的Class文件
基于寄存器架构,不是jvm的栈架构。
执行的是编译以后的dex(Dalvik Executable)文件。执行效率比较高。
它执行的dex(Dalvik Executable)文件可以通过class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。
Android 5.0使用支持提前编译(Ahead of Time Compilation,AoT)的ART VM替换Dalvik VM。
13、Graal VM
2018年4月,oracle Labs公开了GraalvM,号称 “Run Programs Faster Anywhere”,勃勃野心。与1995年java的”write once,run anywhere"遥相呼应。
GraalVM在HotSpot VM基础上增强而成的
跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。
语言包括:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R等支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件
工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。
如果说HotSpot有一天真的被取代,Graalvm希望最大
。但是Java的软件生态没有丝毫变化。
一、Java虚拟机概述与JVM结构相关推荐
- JVM学习笔记0:Java虚拟机概述
目录 第1章 Java虚拟机概述 1.1 虚拟机与Java虚拟机 1.2 JVM 1.2.1 JVM的位置 1.2.2 JVM的整体结构 1.2.3 Java代码执行流程 1.2.4 JVM的架构模型 ...
- Java虚拟机(一)结构原理与运行时数据区域
前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟 ...
- 【Java虚拟机规范】JVM类加载机制
[Java虚拟机规范]JVM类加载机制 理论知识 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading).验证(Verification).准备(Prep ...
- java 参数类型不确定_详细解析Java虚拟机的栈帧结构
什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看<Java虚拟机内存结构及编码实战>)这次要介绍 ...
- Java虚拟机详解----JVM常见问题总结
[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...
- java 虚拟机类加载 及内存结构
http://www.jb51.net/article/105920.htm https://www.cnblogs.com/Qian123/p/5707562.html Java类加载全过程 一个j ...
- 程序计数器(PC寄存器)以及java虚拟机栈的存储结构与运行原理的基本介绍
学习内容: 1.运行时数据区的结构 2.JVM线程的说明 3.程序计数器(PC寄存器) 4.java虚拟机栈 内容详情: 1.运行时数据区的结构 其中:上面的本地方法栈,程序计数器,虚拟机栈是每个线程 ...
- java虚拟机_一文彻底读懂Java虚拟机!(JVM)
提到Java虚拟机(JVM),可能大部分人的第一印象是"难",但当让我们真正走入"JVM世界"的时候,会发现其实问题并不像我们想象中的那么复杂.唯一真正令我们恐 ...
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- Java虚拟机这一块 —— JVM 调优和深入了解性能优化
JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...
最新文章
- 聊聊linux查看服务和端口状态命令netstat
- 【1】万魂杀MMORPG研发回顾
- 动态规划算法-06Longest Valid Parentheses问题
- Linux常用命令 -- screen
- Hadoop学习笔记—14.ZooKeeper环境搭建
- B00005 函数atoi()(去空格,带符号)
- linux虚拟机上挂载U盘
- 在Android系统中,F2FS 文件系统问题分析步骤
- 支持VS2017的vax插件VA_X_Setup2210
- TouchDesigner处理串口数据
- r730服务器安装系统蓝屏6,安装系统蓝屏解决解决方法
- linux 查找目录或文件 (详解)
- 使用FastJson进行驼峰下划线相互转换写法及误区
- 2022年江苏专转本计算机大类考生经验分享(上岸南工程)
- 顺口溜记23种设计模式
- 多元时间序列预测之(一)DA-RNN模型
- ubuntu ip地址修改
- 最后一个人可以挽救360和QQ的——马云
- 阿里云备案审核一般多久能过?域名备案需要几天?
- IOS开发之——入门
热门文章
- 闲聊一下android 3D 网络游戏
- 李阳音标速成MP3文本
- android维持登录状态
- kernel支持4k/16k/64k pagesize
- T270731 中奖
- 台湾大学林轩田机器学习技法课程学习笔记14 -- Radial Basis Function Network
- KTL 一个支持C++14编辑公式的K线技术工具平台 - 第五版,支持sqlite3,全新sqlite3zz语法超简单使用sqlite3; 添加方差等统计函数。
- python泰坦尼克号生存预测论文_Kaggle 泰坦尼克号生存预测--8%(Python)
- 英语学习详细笔记(八)动名词
- thinkphp集成系列之阿里云oss