JVM工作原理与实战(一):初识JVM

简介: JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。同时,JVM还具备动态优化功能,可以根据实际运行情况进行调整和优化。本文主要介绍了JVM的概念、JVM的三大核心功能、常见的JVM虚拟机等内容。

一、JVM概念

JVM,全称Java Virtual MachineJava虚拟机),是一个运行在计算机上的程序,其核心任务是运行Java字节码文件。Java字节码是一种中间代码,它是由Java源代码编译而来,但并非直接运行在硬件或操作系统上,而是通过JVM来解释或编译执行。这一设计使得Java能够在任何支持JVM的平台上运行,真正实现了“一次编写,到处运行”的理念。

image.gif

二、JVM的三大核心功能

1.内存管理

JVM的内存管理是整个虚拟机中非常重要的部分。其负责管理堆内存,这是JVM中用于动态分配内存的区域。当Java程序创建对象时,JVM会在堆上为该对象分配内存。这种分配是动态的,意味着可以根据需要调整内存的大小。

堆内存的管理涉及到两个主要方面:对象的创建对象的销毁。当一个对象被创建时,JVM会在堆上为其分配内存。这个过程涉及到内存的分配和初始化,确保对象能够正确地存储数据。而当对象不再被引用,或者程序结束时,JVM会自动回收这些内存,以释放资源。

内存管理还包括垃圾回收(Garbage Collection, GC)机制。垃圾回收器自动检测并清除那些不再被引用的对象,释放其占用的内存。这一过程是为了防止内存泄漏,并确保系统的稳定运行。

2.解释执行虚拟机指令

解释执行是JVM执行Java字节码的一种方式。Java源代码在编译时会被转换成字节码,这是一种中间代码,它不直接对应任何特定的硬件架构。然后,JVM通过解释器逐条解释这些字节码并执行相应的操作。

解释执行的优势在于它的跨平台性。由于字节码是中间代码,无论在哪种操作系统或硬件平台上,只要安装了对应的JVM,就可以运行Java程序。这极大地提高了Java的跨平台能力。

然而,解释执行也有其缺点,主要是执行速度相对较慢。为了提高程序的执行效率,一些高级的JVM会使用即时编译(JIT)技术。

3.即时编译

即时编译(Just-In-Time)是一种优化技术,它在程序运行时将热点代码编译成本地机器码。这些热点代码通常是频繁执行的代码片段,将它们编译成本地代码可以显著提高执行速度。

即时编译的优势在于它能够根据运行时的实际情况进行优化。JVM可以监测代码的执行情况,识别出那些频繁执行的热点代码,然后将其编译成本地机器码。这不仅提高了执行速度,而且减少了解释器的工作负担。

即时编译的实现通常包括两个步骤:编译优化。编译是将字节码转换成机器码的过程,而优化则是在编译的基础上进一步提高代码的执行效率。通过即时编译,JVM能够在运行时动态地调整和优化代码的执行,从而提高程序的性能。

image.gif

三、常见的JVM虚拟机

常见的JVM:

名称 公司 支持版本 社区活跃度 特性 适用场景

HotSpot

(Oracle JDK版)

Oracle 所有版本

使用最广泛,稳定可靠,社区活跃

JIT支持

Oracle JDK默认虚拟机

默认

HotSpot

(Open JDK版)

Oracle 所有版本

同上

开源,Open JDK默认虚拟机

默认

对JDK有二次开发需求

GraalVM Oracle

11, 17,19

企业版支持8

多语言支持

高性能、JIT、AOT支持

微服务、云原生架构

需要多语言混合编程

Dragonwell JDK

龙井

Alibaba

标准版 8,11,17

扩展版11,17

基于OpenJDK的增强

高性能、bug修复、安全性提升

JWarmup、ElasticHeap、Wisp特性支持

电商、物流、金融领域

对性能要求比较高

Eclipse OpenJ9

(原 IBM J9)

IBM 8,11,17,19,20

高性能、可扩展

JIT、AOT特性支持

微服务、云原生架构

1.HotSpot

HotSpot是由Oracle(原Sun Microsystems)开发的一款高性能的JVM,被广泛使用。为了提高Java程序的执行效率,HotSpot虚拟机采用了多种优化技术,其中最核心的是即时编译技术。此外,HotSpot虚拟机还支持一种称为“混合编译”的优化技术,它将解释执行和即时编译结合起来,进一步优化程序的性能。

除了即时编译技术外,HotSpot虚拟机还具有其他高性能特性。它优化了垃圾回收器和内存管理器,为Java程序提供了高效、稳定的运行环境。这些特性共同作用,使HotSpot成为高性能、可扩展的JVM,广泛适用于各种应用程序和场景。

2.GraalVM

GraalVM是一个高性能的运行时环境,可以运行多种语言的程序,包括Java、JavaScript、Python等。它旨在提供一种统一的运行时环境,以支持各种不同的编程语言和框架。

GraalVM通过使用即时编译和垃圾回收技术来提高程序的执行效率。它还提供了一种称为“Truffle”的框架,用于实现自定义语言的解释器和编译器。通过Truffle框架,开发者可以使用高级语言编写程序,并利用GraalVM的高性能特性来运行它们。

除了高性能的即时编译和垃圾回收功能外,GraalVM还支持多种语言的互操作性。这意味着开发者可以在同一个应用程序中使用不同的编程语言,并轻松地调用和交互它们的功能。这种互操作性使得GraalVM成为一种灵活、高效的多语言运行时环境。

3.Dragonwell JDK 龙井

Dragonwell JDK是阿里巴巴提供的一款功能增强版的JVM。它基于HotSpot虚拟机进行了一些优化和增强,旨在提高Java程序的性能和稳定性。

Dragonwell JDK通过优化HotSpot虚拟机的内部机制来提高Java程序的执行效率。它涉及对垃圾回收器、即时编译器和其他核心组件的调整和改进。这些优化旨在提高程序的启动速度、运行时的性能以及减少资源消耗。

除了性能优化外,Dragonwell JDK还提供了一些额外的功能和工具,以增强开发者的体验和应用程序的质量。其中包括对特定于中国市场的特性的支持、更好的调试和监控工具以及对最新Java版本的早期支持等。

4.Eclipse OpenJ9

OpenJ9是IBM开发的一款高性能的JVM,它不仅支持Java SE标准,还提供了强大的垃圾回收和诊断工具。作为一款专为企业级应用打造的高性能JVM,OpenJ9致力于为应用程序提供稳定、高效的运行环境。

OpenJ9虚拟机具有优化的垃圾回收机制,可以有效地管理内存并减少内存泄漏的风险。它还提供了一套丰富的诊断工具,帮助开发者和系统管理员监控和调试Java应用程序。这些工具包括性能分析器、内存监视器和线程分析器等,可以帮助开发者分析程序的性能瓶颈和解决潜在问题。

OpenJ9在大型企业级应用和关键任务应用中得到了广泛应用。它被认为是一种可靠、高性能的JVM选择,适用于需要高可用性和可扩展性的应用程序场景。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了JVM的概念、JVM的三大核心功能、常见的JVM虚拟机等内容,希望对大家有所帮助。

相关文章
|
Oracle Java 关系型数据库
JVM深入原理(一+二):JVM概述和JVM功能
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行。
333 0
|
Arthas 存储 Java
JVM深入原理(三+四):JVM组成和JVM字节码文件
目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
238 0
|
存储 安全 Java
JVM深入原理(五):JVM组成和JVM字节码文件
类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
229 0
|
Arthas Java 测试技术
JVM深入原理(六)(一):JVM类加载器
目录6. JVM类加载器6.1. 类加载器-概述6.2. 类加载器-执行流程6.3. 类加载器-分类(JDK8)6.3.1. JVM底层实现的类加载器6.3.1.1. 启动类加载器6.3.2. Java代码实现类的加载器6.3.2.1. 扩展类加载器6.3.2.2. 应用程序类加载器6.4. 类加载器-Arthas查看类加载器
260 0
|
Java 关系型数据库 MySQL
JVM深入原理(六)(二):双亲委派机制
自定义类加载器打破双亲委派机制的方法:复写ClassLoader中的loadClass方法常见问题:要加载的类名如果是以java.开头,则会抛出安全性异常加载自定义的类都会有一个共同的父类Object,需要在代码中交由父类加载器去加载自定义类加载器不手动指定parent会默认指定应用类加载两个自定义类加载器加载同一个类会被认为是两个对象,只有相同的类加载器+想通的类限定名才会被认为是一个对象。
436 0
|
存储 安全 Java
JVM深入原理(七)(一):运行时数据区
栈的介绍:Java虚拟机栈采用栈的数据结构来管理方法调用中的基本数据,先进后出,每一个方法的调用使用一个栈帧来保存栈的组成:栈:一个线程运行所需要的内存空间,一个栈由多个栈帧组成栈帧:一个方法运行所需要的内存空间活动栈帧:一个线程中只能有一个活动栈帧栈的生命周期:栈随着线程的创建而创建,而回收会在线程销毁时进行栈的执行流程:栈帧压入栈内执行方法执行完毕释放内存若方法间存在调用,那么会压入被调用方法入栈,执行完后释放内存,再执行当前方法,直到执行完毕,释放所有内存。
280 0
|
存储 缓存 安全
JVM深入原理(七)(二):运行时数据区
堆的作用:存放对象的内存空间,它是空间最大的一块内存区域.栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享。堆的特点:线程共享:堆中的对象都需要考虑线程安全的问题垃圾回收:堆有垃圾回收机制,不再引用的对象就会被回收方法区的概述:方法区是存放基础信息的位置,线程共享,主要包括:类的元信息:保存了所有类的基本信息运行时常量池:保存了字节码文件中的常量池内容静态常量池:字节码文件通过编号查表的方式找到常量。
216 0
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
322 0
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
325 0
|
Rust 安全 Java
JVM原理与实现——Synchronized关键字
在多线程Java程序中,`Synchronized`关键字用于确保线程安全。本文深入探讨其工作原理,通过分析字节码`monitorenter`和`monitorexit`,解释JVM如何实现同步机制。文章展示了`Synchronized`方法的编译结果,并详细解析了轻量锁和重度锁的实现过程,包括Mark Word的状态变化及CAS操作的应用。最后简要介绍了`ObjectMonitor::enter()`函数在获取重度锁时的作用。
356 0
JVM原理与实现——Synchronized关键字