1、HotSpot JVM标准结构
最上层:javac编译器将编译好的字节码class文件,通过java 类装载器 执行机制,把对象或class文件 存放在 jvm划分内存区域
中间层:从左至右 方法区(持久代也叫非堆)、堆(共享,GC回收对象区域)、栈、程序计数器和寄存器、本地栈(私有)
最下层:jvm最核心两块 JIT(just in time)即时编译器 和 GC(Garbage Collection,垃圾回收器)
java执行流程:
2.运行时数据区域Runtime Data Areas
2.1 JVM是什么?
官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
JVM主要管理两种类型的内存:堆和非堆。
堆就是Java代码可及的内存,是留给开发人员使用的;
非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
2.2 堆内存分配?
内存计算公式:
总内存 = 堆内存(Xmx)+方法区内存(MaxPermSize)+栈内存(Xss)*线程数+直接内存(MaxDirectMemorySize,堆外)+虚拟机内存
1. 配置程序JVM参数如下: -Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=8 -XX:PermSize=10M -XX:MaxPermSize=10M -Xss512k 2. 实际内存分配: PS Young Generation(10M ,eden:from survivor:to survivor=8:1:1) Eden Space: 8M From Space:(1.0MB) To Space:(1.0MB) PS Old Generation (10M) PS Perm Generation(10M)
2.3 堆内存参数设置?
详细参数配置参考:
3.执行引擎(Execution Engine)
3.1 解释器和JIT执行原理
java文件转化为机器码过程:
interpreter:解释器
JIT:即时编译器
通过类装载器装载的,被分配到JVM的运行时数据区的字节码会被执行引擎执行。执行引擎以指令为单位读取Java字节码。它就像一个CPU一 样,一条一条地执行机器指令。每个字节码指令都由一个1字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继 续执行下一条操作码。
不过Java字节码是用一种人类可以读懂的语言编写的,而不是用机器可以直接执行的语言。因此,执行引擎必须把字节码转换成可以直接被JVM执行的语言。字节码可以通过以下两种方式转换成合适的语言。
- 解释器(解释执行):一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢。这是解释执行的语言的一个缺点。字节码这种“语言”基本来说是解释执行的。
- 即时(Just-In-Time)编译器(编译执行): 即时编译器被引入用来弥补解释器的缺点。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码。然后,执行引 擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多。编译后的代码可以执行的很快,因为 本地代码是保存在缓存里的。
不过,用JIT编译器来编译代码所花的时间要比用解释器去一条条解释执行花的时间要多。因此,如果代码只被执行一次的话,那么最好还是解释执行而不是编译后再执行。因此,内置了JIT编译器的JVM都会检查方法的执行频率,如果一个方法的执行频率超过一个特定的值的话,那么这个方法就会被编译成本地代码。
图 7:Java编译器和JIT编译器
JVM规范没有定义执行引擎该如何去执行。因此,JVM的提供者通过使用不同的技术以及不同类型的JIT编译器来提高执行引擎的效率。
大部分的JIT编译器都是按照下图的方式来执行的:
图 8: JIT编译器
JIT编译器把字节码转换成一个中间层表达式,一种中间层的表示方式,来进行优化,然后再把这种表示转换成本地代码。
Oracle Hotspot VM使用一种叫做热点编译器的JIT编译器。它之所以被称作”热点“是因为热点编译器通过分析找到最需要编译的“热点”代码,然后把热点代码编译成本地代码。如果已经被编译成本地代码的字节码不再被频繁调用了,换句话说,这个方法不再是热点了,那么Hotspot VM会把编译过的本地代码从cache里移除,并且重新按照解释的方式来执行它。Hotspot VM分为Server VM和Client VM两种,这两种VM使用不同的JIT编译器。
Figure 9: Hotspot Client VM and Server VM
Client VM 和Server VM使用完全相同的运行时,不过如上图所示,它们所使用的JIT编译器是不同的。Server VM用的是更高级的动态优化编译器,这个编译器使用了更加复杂并且更多种类的性能优化技术。
IBM 在IBM JDK 6里不仅引入了JIT编译器,它同时还引入了AOT(Ahead-Of-Time)编译器。它使得多个JVM可以通过共享缓存来共享编译过的本地代码。简而言之,通过AOT编译器编译过的代码可以直接被其他JVM使用。除此之外,IBM JVM通过使用AOT编译器来提前把代码编译器成JXE(Java EXecutable)文件格式来提供一种更加快速的执行方式。
大部分Java程序的性能都是通过提升执行引擎的性能来达到的。正如JIT编译器一样,很多优化的技术都被引入进来使得JVM的性能一直能够得到提升。最原始的JVM和最新的JVM最大的差别之处就是在于执行引擎。
相关文章:
- JAVA虚拟机-JMM内存模型(六)
-
JAVA虚拟机-JVM性能调优(五) -
JAVA虚拟机-G1 Heap Structure(四) -
JAVA虚拟机-CMS Heap Structure(三) -
JAVA虚拟机-GC介绍和垃圾算法理解(二) -
JAVA虚拟机-Java体系结构及hotspot介绍(一)
详细可参考:
oracle官网:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide
并发编程网:
csdn:
相关推荐
甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM, 而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机, Sun公司注意到了这款...
《Java虚拟机精讲》以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法...
OpenJDK17U-jdk-x64-windows-hotspot-17.0.5-8,vscode配置java环境需要
从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型
对于Java开发来说,《Java虚拟机规范》才是最为官方、准确的一个文档,了解这个规范可以让我们更深入地理解JVM。我们平常说的JVM其实更多说的是HotSpot(HotSpot是JVM规范的一种实现),但我们常常将HotSpot与JVM...
深入解析Java虚拟机
本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器...
这是官方的原版表中文档。Java11平台中,官方hotspot虚拟机的具体实现的标书。
JDK17社区封装版,也就是普通用户眼中的Java17,使用VSCode或Eclipse时会要求安装该文件,如果使用默认链接,会从GitHub下载安装,下载速度慢、连接不稳定。 社区版会较原版做一些优化,收社区人员维护并使用,还是...
Java虚拟机栈 栈帧 局部变量表 操作数栈 动态连接 方法出口 本地方法栈 堆 方法区 JavaVirtualMachineError StackOverflowError OutOfMemoryError JVM PS:JVM部分参考了《深入理解Java虚拟机 - 第二版》(周志明). ...
关于java虚拟机的详细解析,从内存分析到垃圾回收算法,hotspot虚拟机回收机制的详细分析,欢迎下载!
带标签的,java虚拟机中比较好的一本书,值得阅读与收藏
JDK10(JDK10底层C++源码及hotspot虚拟机源码)
JDK7底层C++源码及hotspot虚拟机源码
资源概要:JVM基础知识;类加载子系统;运行时数据区;对象的创建流程与内存分配;...从广义上讲Java,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及其相关的程序都属于Java技术体系中的一员。
OpenJDK11U-jdk-x64-windows-hotspot-11.0.16-8 JDK11
本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器...
OpenJDK17U-jdk_x64_windows_hotspot_17.0.1_12.msi
【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序