初识JVM(简单易懂),解开JVM神秘的面纱

目录

 

一、什么是JVM(Java虚拟机)?

二、JVM的功能

三、JVM的功能-即时编译 

四、常见的JVM

五、JVM的组成

五、JVM的工作流程

        参考资料


一、什么是JVM(Java虚拟机)?

在Java的世界里,Java虚拟机(JVM)扮演着至关重要的角色。它不仅是Java程序运行的环境,更是实现“一次编写,到处运行”的关键。本文将深入探讨JVM的核心组成部分,从类加载到执行引擎,解开JVM神秘的面纱。

 JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件

JVM,即Java虚拟机,是一个用于执行Java字节码的虚拟计算机。它是在硬件或操作系统上构建的一个软件层,使Java字节码可以在不同的平台上运行。即时编译(Just-In-Time compilation)是JVM的一个关键功能,它允许JVM在运行时将字节码编译成本地代码,以提高程序的性能。

即时编译的主要功能如下:

  1. 预编译(Compile-Ahead-Of-Time):JVM首先将Java源代码编译成字节码,然后这些字节码在运行时被即时编译成本地代码。这种预编译的方式使得程序在第一次运行时不需要进行编译,从而提高了程序的启动速度。
  2. 热点代码优化:JVM通过热点代码优化技术来提高程序的运行效率。热点代码是指被频繁执行的代码。JVM在运行时收集这些热点代码的执行信息,并将它们编译成更高效的本地代码。这种优化可以显著提高程序的性能,特别是对于那些频繁运行的代码。
  3. 动态编译:即时编译还支持动态编译。这意味着JVM可以根据程序在运行时的行为动态地调整编译策略。例如,如果某个方法没有被频繁调用,那么JVM可以暂时不将其编译成本地代码,以节省资源。相反,如果某个方法被频繁调用,JVM可以将其优先编译成本地代码,以提高程序的运行效率。
  4. 内存管理和垃圾回收:JVM还提供了内存管理和垃圾回收的功能。这些功能可以帮助程序员更好地管理内存资源,并提高程序的可靠性。

总之,即时编译是JVM的一个重要功能,它可以帮助程序员提高程序的性能和可靠性。通过将Java字节码编译成本地代码,JVM可以减少解释字节码所需的时间,从而提高程序的执行速度。同时,即时编译还可以根据程序在运行时的行为动态地调整编译策略,以进一步提高程序的性能。

 将字节码文件转换成计算机可以看懂的机器码文件。这就是Java虚拟机的主要功能。

二、JVM的功能

三、JVM的功能-即时编译 

 JVM可以将热点的代码字节指令,保存到内存中,等到再次执行时可以直接调用。

四、常见的JVM

常见的JVM包括HotSpot、JRockit、J9等。

HotSpot是较新的Java虚拟机技术,用来代替JIT(just-in-time compilation,及时编译)技术,可以大大提高Java运行的性能。HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显著提高了性能。它从运行应用中采样数据,从而可以优化代码,进而得到良好性能。HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,从而使这部分代码的执行更加迅捷。但它的启动时间较长。

JRockit是BEA公司开发的,可以直接运行在自家Hypervisor系统上的JRockit VM的虚拟化版本,JRockit VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如文件系统、网络支持等。

IBM J9是IBM开发的Java虚拟机,它也支持即时编译技术。

我们开发时,基本都会优先选择使用HotSpot。 

五、JVM的组成

JVM主要组成有四个子系统组成:类加载系统运行时数据区域执行引擎本地方法接口
 

  1. 类加载系统(Class Loading System):

    • 加载(Loading): 加载是指查找字节码文件,并创建一个Class对象的过程。字节码文件通常由Java编译器从Java源代码生成。
    • 验证(Verification): 确保字节码文件符合Java语言规范,并且不包含不安全或非法的代码。
    • 准备(Preparation): 为类的静态变量分配内存并设置默认初始值。
    • 解析(Resolution): 将常量池中的符号引用替换为直接引用,使得各个类之间能够正确地引用。
  2. 执行引擎(Execution Engine):

    • 解释器(Interpreter): 将字节码文件逐行解释为机器码并执行。
    • 即时编译器(Just-In-Time Compiler,JIT): 将整个字节码文件编译为机器码,提高执行速度。
    • 栈操作(Stack Operations): 使用操作栈进行方法调用、参数传递等。
  3. 本地方法接口(Native Interface):

    • 允许Java应用程序调用本地方法(通常使用C或C++编写的代码)。Java的本地方法接口允许Java代码与本地库进行交互,实现了Java与其他语言的衔接。JVM通过本地库接口与操作系统提供的库进行交互,保证了Java程序的可移植性。
  4. 运行时数据区域(Runtime Data Area):

    • 方法区(Method Area): 存储类的结构信息,如类的字段、方法信息。
    • 堆(Heap): 存储对象实例,包括程序运行时创建的对象。
    • 栈(Stack): 存储局部变量、方法调用和返回地址。
    • 程序计数器(Program Counter): 记录当前线程执行的字节码行号。
    • 本地方法栈(Native Method Stack): 执行本地方法时使用的栈。

Java程序能够在不同平台上实现“一次编写,到处运行”的特性。类加载系统负责加载和验证Java类,执行引擎负责执行Java代码,本地方法接口提供了与底层系统的交互能力,而运行时数据区域存储程序执行时的数据。JVM通过本地库接口与操作系统提供的库进行交互,保证了Java程序的可移植性。

以上图来源于黑马课件 

此图来源于《深入理解Java虚拟机》 

五、JVM的工作流程

JVM的工作流程通常包括以下几个步骤:

  1. 加载(Loading)
    加载阶段是JVM启动的第一个阶段,它负责从系统中加载Java类和接口的定义信息。加载阶段的主要任务是找到并加载Java类和接口的定义信息,并将其存储在内存中。这些定义信息包括类的成员变量、成员方法、构造函数等。在加载阶段,JVM还会对类的定义信息进行验证,以确保其符合Java语言的规范。
  2. 链接(Linking)
    链接阶段是加载阶段的后续阶段,它负责验证类的定义信息、为类的成员变量分配内存并设置默认值,以及解析类的符号引用。在链接阶段,JVM会对类进行一系列的验证,以确保其符合Java语言的规范。如果验证不通过,则会抛出异常。此外,链接阶段还会为类的成员变量分配内存并设置默认值,以及解析类的符号引用。符号引用是指用符号来引用类、方法、变量等的一种方式。
  3. 初始化(Initialization)
    初始化阶段是链接阶段的后续阶段,它负责执行类的初始化代码。初始化阶段的主要任务是执行类的初始化代码,包括静态初始化块和静态初始化方法。在初始化阶段,JVM会执行类的静态代码块和静态变量的初始化代码。如果存在多个静态变量或静态代码块,则会按照它们在类中的顺序依次执行。
  4. 执行(Execution)
    执行阶段是JVM的核心阶段,它负责执行Java程序的字节码指令。执行阶段的主要任务是执行Java程序的字节码指令,包括对成员变量的读写操作、方法的调用等。在执行阶段,JVM会根据程序的指令逐条执行字节码指令,从而实现Java程序的运行。
  5. 卸载(Unloading)
    卸载阶段是JVM的最后一个阶段,它负责卸载不再被使用的Java类和接口的定义信息。卸载阶段的主要任务是回收被卸载的类占用的内存空间,以便重新被使用。在卸载阶段,JVM会回收被卸载的类占用的内存空间,以便重新被使用。

以上就是JVM的基本工作流程,不同的JVM实现可能会有一些差异,比如内存分配策略、垃圾收集器类型等。

深入了解Java虚拟机,我们不仅能够更好地理解Java程序的运行机制,还能够优化程序性能、解决内存泄漏等问题。JVM的神秘面纱下,是一个复杂而高效的执行环境,为Java的成功贡献着重要的力量。让我们在编写Java程序的同时,更加深入地认识JVM,为程序的优化和调优提供更多的可能性。

参考资料

  • The Java® Virtual Machine Specification
  • 深入理解Java虚拟机(第三版)

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

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

相关文章

代码文档浏览器 Dash mac中文版软件特色

Dash mac是一个基于 Python 的 web 应用程序框架,它可以帮助开发者快速构建数据可视化应用。Dash 的工作原理是将 Python 代码转换成 HTML、CSS 和 JavaScript,从而在浏览器中呈现交互式的数据可视化界面。Dash 提供了一系列组件,包括图表、表…

如何将设置为静态IP的VMware虚拟机进行克隆以便可以复刻相应的环境

一定要关闭需要克隆的虚拟机右键要选择克隆的虚拟机,选择管理->克隆,进入克隆虚拟机向导 设定克隆出来的虚拟机名称以及位置,选择完成 克隆完成之后将会生成虚拟机,示例中生成的虚拟机为ubuntu-dev2 因为原本的虚拟机为静态ip的…

区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用

视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等,AI智能分析技术无处不在。在某些场景中,重点区域的人数统计与…

Java集合拓展01

1、List,Set,Map三者的区别 List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和…

EMG肌肉信号处理合集 (一)

本文归纳了常见的肌肉信号预处理流程,方便EMG信号的后续分析。使用pyemgpipeline库 来进行信号的处理。文中使用了 UC Irvine 数据库的下肢数据。 目录 1 使用wrappers 定义数据类,来进行后续的操作 2 肌电信号DC偏置去除 3 带通滤波器处理 4 对肌电…

SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 负载均衡

目录 一、LoadBalancer 负载均衡 1.1、前言 1.2、LoadBalancer 负载均衡底层实现原理 二、整合 OpenFeign LoadBalancer 2.1、所需依赖 2.2、具体实现 2.3、自定义负载均衡策略 一、LoadBalancer 负载均衡 1.1、前言 在 2020 年以前的 SpringCloud 采用 Ribbon 作为负载…

OOM问题排查+Jvm优化

OOM问题排查: 1、top命令:查看cpu和内存的使用情况。 2、jstat命令:查看YGC和FGC情况,一般都是老年代不够用。导致OOM 3、jmap命令: 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…

80基于matlab的小波包熵与模糊C均值聚类的故障诊断,以凯斯西储大学轴承数据为例进行分析

基于matlab的小波包熵与模糊C均值聚类的故障诊断,以凯斯西储大学轴承数据为例进行分析。对数据进行小波包分解后重构,然后提取各频带能量分布,后计算小波包熵进行故障诊断。输出特征可视化结果。数据可更换自己的,程序已调通&…

Git远程库操作(GitHub)

GitHub 网址:https://github.com/ 创建远程仓库 远程仓库操作 命令名称作用git remote -v查看当前所有远程地址别名git remote add 别名 远程地址起别名git push 别名 分支推送本地分支上的内容到远程仓库git clone 远程地址将远程仓库的内容克隆到本地git pull 别…

基于STM32的色彩识别与分类算法优化

基于STM32的色彩识别与分类算法优化是一项与图像处理和机器学习相关的研究任务,旨在实现高效的色彩识别和分类算法在STM32微控制器上的运行。本文将介绍基于STM32的色彩识别与分类算法优化的原理和实现步骤,并提供相应的代码示例。 1. 色彩识别与分类概…

[SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

pdf | proj | code 本文提出一种新的3D数据表达形式3D Gaussians。每个Gaussian由以下参数组成:中心点位置、协方差矩阵、可见性、颜色。通过世界坐标系到相机坐标系,再到图像坐标系的仿射关系,可将3D Gaussian映射到相机坐标系,通…

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…

Rust语言特性探秘:宏的魔力

大家好&#xff01;我是lincyang。 今天我们继续深入探讨Rust语言中的一个有趣而强大的特性——宏&#xff08;Macros&#xff09;。 宏在Rust中扮演着特殊的角色&#xff0c;不仅提高了代码的灵活性&#xff0c;还增强了代码的可重用性。接下来&#xff0c;我们会通过具体的…

[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

Redis-Redis缓存高可用集群

1、Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可…

深信服技术认证“SCSA-S”划重点:信息收集

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师…

OpenCvSharp从入门到实践-(02)图像处理的基本操作

目录 图像处理的基础操作 1、读取图像 1.1、读取当前目录下的图像 2、显示图像 2.1、Cv2.ImShow 用于显示图像。 2.2、Cv2.WaitKey方法用于等待用户按下键盘上按键的时间。 2.3、Cv2.DestroyAllWindows方法用于销毁所有正在显示图像的窗口。 2.4实例1-显示图像 2.4实例…

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测 目录 分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析-改进蜣螂算法优化最小二乘支持向量机的分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.多特…

校园圈子论坛,交友,帖子内短视频,二手市场,APP小程序H5三端交付,源码交付,支持二开

校园圈子论坛&#xff0c;交友频道&#xff0c;商城&#xff0c;二手市场&#xff0c;活动专区&#xff0c;短视频&#xff0c;从校园生活的方方面面展现出了充满活力和创造力的镜头。这个频道是一个让学生们相互交流、结识新朋友的平台&#xff0c;不仅有交友功能&#xff0c;…

【done+重点】剑指Offer56-I:找出数组中2个只出现1次的整数

力扣&#xff0c;https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/description/ 题目&#xff1a;一个整型数组nums里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间…