首页 > 系统相关 >内存与垃圾回收篇之(一)JVM与Java体系结构

内存与垃圾回收篇之(一)JVM与Java体系结构

时间:2024-02-29 19:48:41浏览次数:29  
标签:Java 虚拟机 VM HotSpot 编译器 JVM 体系结构

JVM与Java体系结构

1. 前言

JVM拥有当前最前沿、最成熟的垃圾回收算法

JIT:即时编译器

AOT:提前编译器

JVM:代码托管技术

拓展:

  1. 前端编译器:负责把Java文件编译成Class文件,如Sun的Javac;
  2. 后端运行期编译器(JIT编译器):负责把Class文件的字节码转换成机器码,如HotSpot 的C1,C2编译器;
  3. 静态提前编译器(AOT编译器):直接将Java文件部分内容编译成本地机器代码,如GCJ。

参考网站:https://baijiahao.baidu.com/s?id=1605469123039888640&wfr=spider&for=pc

Java VS C++

Java的优势:内存动态分配(自动管理内存)和垃圾收集技术(分配的内存要想再次使用就要用到垃圾回收)

LTS:长期支持版本

Java 8是目前用的最多的

Java 11是LTS版本的,是下一个热门的版本

JVM有很多厂家的,我们应该学的是Oracle官方推出的Java HotSpot虚拟机

2. 参考书籍

2.1 官网推出的JVM规范(Specifications)

2.2 Java虚拟机规范

​ 相当于官网JVM规范的中文翻译版,不建议购买

2.3 深入理解Java虚拟机

​ 推荐购买

2.4 其他书籍

3. Java及JVM简介

TIOBE语言热度排行榜: https://www.tiobe.com/tiobe-index/

世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言

互联网基于JS、人工智能基于Python、微服务基于Go

Oracle发布的JDK:OpenJDK和OracleJDK

Harmony:Apache旗下的JVM

Java(跨平台的语言)

3.1 JVM(跨语言的平台)

为什么说JVM是跨语言的平台?

​ JVM直接面向的是字节码文件,只关心字节码文件,只要字节码文件符合JVM字节码文件的规范,JVM就可以执行。字节码文件是可以由不同的编程语言所提供的,只要不同的编程语言提供各自的编译器编译出来以后的字节码文件遵循JVM字节码文件的规范,JVM就可以运行。

Java不是最强大的语言,但是JVM是最强大的虚拟机

信息产业三大技术难题:

1、CPU

2、操作系统

3、编译器

3.2 字节码

字节码并不只是面向Java语言的,字节码可以被称为JVM字节码

3.3 多语言混合编程

​ 基于JVM跨语言的特性,在JVM平台上进行多语言混合编程成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。各语言之间交互非常方便,因为最终都运行在一个虚拟机之上。

3.4 如何真正搞懂JVM?

​ 自己动手写Java虚拟机

4. Java发展的重大事件

1990年 James Gosling(Java语言之父) Java 最早称为 Oak
1995年 正式发布Java和HotJava产品
1996年 JDK 1.0。
1998年 JDK 1.2,Sun发布了JSP/Servlet、 EJB规范,以及将Java分成了J2EE、 J2SE和J2ME。
动设备应用3大领域挺进。
2000年 JDK 1.3发布,Java HotSpot Virtual Machine正式发布,成为Java的默认虚拟机。
2002年 JDK 1.4发布,Classic虚拟机(JDK最初提供的虚拟机)退出历史舞台。
2003年 Java平台的Scala正式发布,同年Groovy也加入了Java阵营 。
2004年 JDK 1.5发布。同时JDK 1. 5改名为JavaSE 5.0(里程碑式的版本)。
2006年 JDK 6发布。Java开源并建立了OpenJDK(当时有SunJDK和OpenJDK)。Hotspot虚拟机也成为了OpenJDK中 的默认虚拟机。

2007年 Java平台迎来了新伙伴Clojure。
2008年,Oracle 收购了BEA, 得到了JRockit虚拟机
2009年,Twitter宣布把后台大部分程序从Ruby迁移到Scala,这是Java平台的又一次大规模应用。
2010年,Oracle收购了Sun,获得Java商标和最具价值的HotSpot虚拟机。此时,Oracle拥有市场占用率最高的两款虛拟机HotSpot和JRockit,并计划在未来对它们进行整合: HotRockit。 JCP组织管理: Java语言
2011年,JDK7发布。在JDK 1.7u4中,正式启用了新的垃圾回收器G1
2017年,JDK9发 布。将G1设置为默认GC,替代CMS(并发的垃圾回收器),同年,IBM的J9开源,形成了现在的Open J9社区
2018年,Android的Java侵权案判决,Google赔偿Oracle计88亿美元,同年,Oracle宣告 JavaEE成为历史名词,JDBC、JMS、 Servlet赠 予Eclipse基金会,同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK授权许可
2019年,JDK12发 布,加入RedHat领导开发的Shenandoah GC

5. 虚拟机与Java虚拟机

虚拟机分为系统虚拟机(VMware、Visual Box等)和程序虚拟机(JVM),系统虚拟机实际上是模拟硬件,程序虚拟机是基于操作系统解释运行某一个应用程序,是运行在操作系统之上的

Java虚拟机

字节码文件是二进制的

JVM特点:

一次编译,到处运行(字节码文件的特点)

自动内存管理

自动垃圾回收功能

JVM位置

.java -> .class过程中用到的是编译器前端,.class在解释运行时会用到编译器后端

Google的Android系统结构

Android用的是Dalvik Visual Machine

6. JVM的整体结构

以HotSpot VM为例

1)自上到下分为三层

2)虚拟机栈(Java栈)

3)在内存当中,多个线程共享堆和方法区

4)虚拟机栈(Java栈)、本地方法栈、程序计数器是每个线程独有一份的

5)类装载器子系统:将Class files加载进内存生成一个Class对象

7. Java代码执行流程

在源文件编译的过程中任何一个编译的环节失败都不能正确的生成字节码文件

Java语言翻译成机器指令的过程主要就是执行引擎完成的

目前主要的虚拟机都采用了解释执行和即使编译并存的方式

解释器负责解释执行字节码,保证响应时间

JIT编译器负责将热点字节码编译为机器指令并缓存到方法区,保证执行性能

如何自己设计一门语言?

借助Java虚拟机,生成的字节码文件满足Java虚拟机规范,设计语言的语法和(前端)编译器

8. JVM的架构模型

指令集的架构模型分为基于栈的指令集架构(栈式架构)和基于寄存器的指令集架构(寄存器架构)

基于栈式架构的特点
➢设计和实现更简单,适用于资源受限的系统 (性能比较低的系统也能使用);
➢避开了寄存器的分配难题:使用零地址指令方式(没有指令,只有操作数)分配。
➢指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。
➢不需要硬件支持,可移植性更好,更好实现跨平台

栈式架构:指令集更小(8bit一个指令),完成一项操作花费较多指令

基于寄存器架构的特点
➢典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虛拟机。
➢指令集架构则完全依赖硬件,可移植性差
➢性能优秀和执行更高效;
➢花费更少的指令去完成一项操作。
➢在大部分情况下,基于寄存器架构的指令集往往都以一地址指令二地址指令三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

寄存器架构:指令集大(16bit一个指令),完成一项操作花费较少指令

HotSpot的指令集架构是基于栈的指令集架构

为什么栈式架构使用零地址方式也能实现功能?

这是因为栈式架构都是操作栈顶元素,所以不需要地址

9. JVM的生命周期

虚拟机的启动
Java虛拟机的启动是通过引导类加载器(bootstrap class loader) 创建一个初始类(initial class) 来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的执行

  • 一个运行中的Java虛拟机有着一个清晰的任务:执行Java程序。
  • 程序开始执行时他才运行,程序结束时他就停止。
  • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虛拟机的进程。

虚拟机的退出
有如下的几种情况:

  • 程序正常执行结束

  • 程序在执行过程中遇到了异常或错误而异常终止

  • 由于操作系统出现错误而导致Java虚拟机进程终止

  • 某线程调用Runtime类或System类的exit方法,或Runtime 类的halt方法,并且Java安全管理器也允许这次exi t或halt操作。

  • 除此之外,JNI ( Java Native Interface) 规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况。

10. JVM的发展历程

Sun Classic VM
早在1996年Javal .0版本的时候,Sun公司发布了-款名为Sun Classic
VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1. 4时
完全被淘汰。
这款虚拟机内部只提供解释器(没有JIT即时编译器) ,效率低。
如果使用JIT编译器,就需要进行外挂。但是一-旦使用了JIT编译器,JIT就
会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作
现在hotspot内置了此虚拟机

Exact VM
●为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机。
●Exact Memory Management: 准确式内存管理
➢也可以叫Non-Conservative/Accurate Memory Management
虚拟机可以知道内存中某个位置的数据具体是什么类型
,具备现代高性能虛拟机的雏形
热点探测(探测出哪些代码属于高频的执行代码)
编译器(JIT)与解释器混合工作模式
●只在Solaris平台短暂使用,其他平台上还是classic vm
➢英雄气短,终被Hotspot虚拟机替换

SUN公司的HotSpot. VM
●HotSpot历史
➢最初由一家名为“Longview Technologies"的小公司设计
➢1997年, 此公司被Sun收购; 2009年,Sun公司被甲骨文收购。
➢JDK1.3时,HotSpot VM成为默认虚拟机
目前Hotspot占有绝对的市场地位,称霸武林。
➢不管是现在仍在广泛使用的JDK6,还是使用比例较多的JDK8中,默认的虚拟机都是
HotSpot
➢Sun/Oracle JDK和OpenJDK的默认虚拟机
➢因此本课程中默认介绍的虛拟机都是HotSpot,相关机制也主要是指HotSpot的GC机
制。(比如其他两个商用虚拟机都没有方法区的概念)
●从服务器、桌面到移动端、嵌入式都有应用
名称中的HotSpot指的就是它的热点代码探测技术
➢通过计数器找到最具编译价值代码,触发即时编译或栈上替换
➢通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡

BEA的JRockit

BEA目前已经被Oracle收购了

专注于服务器端应用
➢它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码
都靠即时编译器编译后执行。
●大量的行业基准测试显示,JRockit JVM是世界上最快的JVM
➢使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了70号)和
硬件成本的减少(达50号)。
●优势:全面的Java运行时解决方案组合
➢JRocki t面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或
微秒级的JVM响应时间,适合财务、军事指挥、电信网络的需要
MissionControl服务套件(JMC),它是一组以极低的开销来监控、管理和分析生产
环境中的应用程序的工具,用于监控内存泄漏
2008年,BEA被Oracle收购。.
Oracle表达了整合两大优秀虚拟机的工作,大致在JDK 8中完成。整合的方式是在
HotSpot的基础上,移植JRockit的优秀特性。
高斯林:目前就职于谷歌,研究人工智能和水下机器人

IBM的J9
全称: IBM Technology for Java Virtual Machine, 简称IT4J,内
部代号: J9
●市场定位与HotSpot接近,服务器端、桌而应用、嵌入式等多用途VM
●广泛用于IBM的各种Java产品。
●目前,有影响力的三大商用虚拟机之-一, 也号称是世界上最快的Java虛拟机(在IBM自己的产品上)。
●2017年左右, IBM发布了开源J9 VM,命名为0penJ9,交给Ecl ipse基金
会管理,也称为Eclipse OpenJ9

三大主要的商用虚拟机:HotSpot、JRockit、J9

KVM和CDC/CLDC Hotspot
Oracle在Java ME产品线上的两款虚拟机为: CDC/CLDC HotSpot
Implementation VM
KVM (Kilobyte)是CLDC-HI早期产品
目前移动领域地位尴尬,智能手机被Android和iOS二分天下。
KVM简单、轻量、高度可移植,面向更低端的设备,上还维持自己的一片
市场
➢智能控制器、传感器
➢老人手机、经济欠发达地区的功能手机
所有的虚拟机的原则:一次编译,到处运行。

Azul VM
●前而三大“高性能Java虚拟机”使用在通用硬件平台上
●这里Azul VM和BEA Liquid VM是与特定硬件平台绑定、软硬件配合的专有虚拟机
➢高性能Java虚拟机中的战斗机。
Azul VM是Azul Systems公 司在HotSpot基础_上进行大量改进,运行于
Azul Systems 公司的专有硬件Vega系统上的Java虛拟机。
每个Azul VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、专有硬件优化的线程调度等优秀特性
2010年,Azul Systems 公司开始从硬件转向软件,发布了自己的Zing
JVM,可以在通用x86平台上提供接近于Vega系统的特性。

性能更好,但应用场景有限

Liquid VM
●高性能Java虚拟机中的战斗机。
●BEA公司开发的,直接运行在自家Hypervisor系统上
●Liquid VM即是现在的JRockit VE (Virtual Edition) , Liquid VM不需要操作系统的支持,或者说它自己本身实现了-一个专用操作系统的必要功能,如线程调度、文件系统、网络支持等
●随着JRockit虚拟机终止开发,Liquid VM项目也停止了。

性能更好,但应用场景有限

Apache Harmony
●Apache也曾经推出过与JDK 1.5和JDK 1.6兼容的Java运行平台
Apache Harmony。
● 它是IBM和Intel联合开发的开源JVM,受到同样开源的OpenJDK的压制,
Sun坚决不让Harmony获得JCP认证,最终于2011年退役,IBM转而参与
OpenJDK
●虽然目前并没有Apache Harmony被大规模商用的案例,但是它的Java
类库代码吸纳进了Android SDK。

Microsoft JVM
●微软为了在IE3浏览器中支持Java Applets, 开发了Microsoft JVM。
●只能在window平台下运行。但确是当时windows'下性能最好的Java VM。
●1997年,Sun以侵犯商标、不正当竞争罪名指控微软成功,赔了sun很多
钱。微软在windowsXP SP3中抹掉了其VM。现在windows.上安装的jdk
都是HotSpot。

Taobao JVM(A1iJVM)
● 由A1iJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、
电商等众多领域,需 要解决高并发、高可用、分布式的复合问题。有大量的开源产品。
基于OpenJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体
系的基石。
基于OpenJDK HotSpot VM发布的国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机
➢创新的GCIH (GC invisible 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应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但
提高了性能.
➢目前已经在淘宝、天猫上线,把Oracle 官方JVM版本全部替换了。

凡是跟硬件和操作系统耦合比较深的性能一般都比较好

Dalvik VM
●谷歌开发的,应用于Android系统,并在Android2.2中提供了JIT,发展迅猛。
Dalvik VM只能称作虚拟机,而不能称作“Java虚拟机”,它没有遵循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。

提前编译:直接把源文件不经过字节码文件直接编译成机器指令

Graal VM

●2018年4月, Oracle Labs公开了Graal VM, 号称
"Run Programs Faster Anywhere",勃勃野心。与1995年java的”write once, run anywhere "遥相呼应。

●Graal VM在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用。语言包括: Java、 Scala、 Groovy、Kotlin; C、C++、JavaScript、Ruby、Python、R等
●支持不同语言中混用对方的接口和对象,支持这些语言使用已经编写好的本地库文件, 工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle.工具集快速构建面向一-种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。 如果说HotSpot有- -天真的被取代,Graal VM希望最大。但是Java的软件生态没有丝毫变化。

还有很多其他的虚拟机没有展开介绍

标签:Java,虚拟机,VM,HotSpot,编译器,JVM,体系结构
From: https://www.cnblogs.com/wzzzj/p/18045258

相关文章

  • java 解压缩文件
    java解压缩文件解压缩zip文件privatestaticfinalintBUFFER_SIZE=2*1024;publicstaticvoidzipUncompress(StringinputFile)throwsException{FilesrcFile=newFile(inputFile);//判断源文件是否存在if(!srcFile.exis......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤2】
    前言:根据API文档中java代码,使用idea编辑代码22.1进入网页,找到java代码https://cloud.baidu.com/doc/IMAGEPROCESS/s/Bk3bclns3 2.2新建java项目     2.3创建java类命名为 Colourize(就是刚才在网页里看到的Java代码的类名)  复制java代码  ......
  • JAVA之CompletableFuture
    目录CompletableFuture入门学习内容学习目标课程学习说明1、FuturevsCompletableFuture1.1准备工作1.2Future的局限性1.3CompletableFuture的优势2、创建异步任务2.1runAsync2.2supplyAsync2.3异步任务中的线程池2.4异步编程思想3、异步任务回调3.1thenApply3.2thenA......
  • java基础
    目录java入门知识:一、开发环境二、关系三、变量四、标识符一、标识符命名的规则二、标识符命名规范1、标识符的命名规则:2、标识符的命名规范:3、变量的声明格式,变量的赋值格式,变量的三要素,变量应该注意几点4、java基本数据类型有哪些?5、java程序的开发步骤是什么?五、运算符一、算术......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤1】
    前言以【黑白图像上色】为例讲解百度AI接口使用,方便新手小白接入,以超级简单的方式操作百度AI库使用步骤1.创建应用获取AK(APIKey),SK(SecretKey)1.1进入: 百度AI官网,在开放能力下面找到:黑白图像上色 1.2选择:立即使用 1.3在创建新应用下,填写相应的信息。注意:接口选择......
  • Cause: java.sql.SQLException: Thread stack overrun: 266768 bytes used of a 2867
    ###Cause:java.sql.SQLException:Threadstackoverrun:266768bytesusedofa286720bytestack,and20000bytesneeded.Use'mysqld--thread_stack=#'tospecifyabiggerstack.;uncategorizedSQLException;SQLstate[HY000];errorcode[143......
  • java程序设计 - 第二次实验
    【实验目的】继续熟悉Eclipse的使用并尝试编写一个简单的Applet程序【实验过程】编写一个JavaApplet程序,并正在JavaApplet中写两行文字:“这是一个JavaApplet程序”和“我改变了字体”。importjava.applet.*;importjava.awt.*;publicclassJavaAppletextendsApplet......
  • Java注解
    一:元注解:元注解(meta-annotation)是指用来注解其他注解的注解。Java语言中提供了4种元注解,分别是@Retention、@Target、@Inherited和@Documented。它们的作用如下:例如,@Retention有一个属性value,是RetentionPolicy类型的,而RetentionPolicy是一个枚举类型RetentionPolicy有SOURCE、......
  • linux下准确查询正在tomcat下运行的java进程。准确获取正在运行的java进程的PID
    查看当前运行的所有的java进程,命令:【一定要注意,取那个你配置的JAVA_HOME全局变量的那个java进程的PID】ps-ef|grepjava     准确获取定位到tomcat下正在运行的java进程的PID命令:ps-ef|grepjava|grepcatalina|awk'{print$2}' 准确定位到tomcat下......
  • java 替换Map中key的值
    importjava.util.*;importjava.util.stream.Collectors;publicclassMapKeyReplacement{publicstaticvoidmain(String[]args){//假设我们有如下的List<Map<String,String>>List<Map<String,String>>list=Arrays.asL......