【从零开始学习JVM | 第一篇】快速了解JVM

news2024/11/24 10:37:13

前言: 

        在探索现代软件开发的丰富生态系统时,我们不可避免地会遇到一个强大而神秘的存在——Java虚拟机(JVM)。作为Java语言最核心的组成之一,JVM已经超越了其最初的设计目标,成为一个多语言的运行平台,支撑着企业级应用、大数据处理、移动应用等众多领域的技术栈。

JVM的独特之处在于它的架构设计,它不仅负责代码的执行,还包括了内存管理、垃圾回收、线程同步等高级功能,这些都是确保高效、稳定运行Java程序的关键因素。随着时间的推移,JVM经过不断的迭代和优化,集成了越来越多先进的性能改进技术,如即时编译(JIT)、热点代码检测、逃逸分析等。

而在本文中,我将为大家从基础层面介绍一下JVM,带领大家揭开JVM的神秘面纱。

目录

前言: 

什么是JVM 

1.JVM的功能:

2.常见的JVM:

3.JVM的组成部分:

总结:


什么是JVM 

        Java虚拟机(JVM)是一个可以执行Java字节码的虚拟计算机。它是Java平台的核心部分,负责运行以Java编程语言编写并编译为Java字节码(.class文件)的程序。JVM的存在使得Java语言能够实现其标志性的“一次编写,到处运行”(Write Once, Run Anywhere,WORA)的特性,因为JVM屏蔽了底层操作系统和硬件平台的差异

我们可以通过以下流程图来了解JVM在JAVA程序中的作用

总结来讲:我们平时自己写的代码需要编译后转为字节码,而JVM再将字节码转为机器码,提交给电脑进行运行。而JVM的功能也不止这些。

1.JVM的功能:

  1. 跨平台性:Java语言使用“一次编写,到处运行”(Write Once, Run Anywhere,WORA)的理念,JVM是这一理念的实现基础。开发者只需编写一次Java代码,然后编译成与平台无关的字节码文件,这些字节码可以在任何安装了兼容JVM的设备上运行。

  2. 内存管理:JVM管理Java程序运行时所需的内存。它包括堆内存(Heap)用于存储对象实例,栈内存(Stack)用于存储局部变量和调用方法的上下文,方法区(Method Area)用于存储类信息,以及其他如程序计数器等结构。JVM还负责垃圾回收(Garbage Collection),自动管理对象的生命周期,回收不再使用的对象占用的内存空间

  3. 执行引擎:JVM中的执行引擎负责解释字节码或通过即时编译器(Just-In-Time Compiler, JIT)将字节码转换为本地机器码执行,从而提高程序的性能。

  4. 安全性:JVM提供了一个相对封闭和安全的执行环境,可以对加载的字节码进行验证,确保其不会执行非法操作。JVM的安全管理器和类加载器也参与到安全检查中,防止恶意代码损害系统。

  5. 多语言支持:虽然JVM最初是为Java语言设计的,但现在它也支持其他语言,如Scala、Kotlin、Groovy等,甚至支持非JVM语言通过特定桥接技术运行在JVM上,如JRuby(Ruby语言的实现)和Jython(Python语言的实现)。

  6. 工具和生态系统:JVM提供了丰富的工具和API,如JConsole、VisualVM等,用于监控和调试运行在JVM上的程序。此外,围绕JVM形成了强大的生态系统,包括各种框架、库和工具,这些都大大增强了Java开发的便捷性和效率。

在这些功能中,即时编译是提升JAVA运行效率的最核心手段,因此我们这里来详细介绍一下即时编译

即时编译:

        在程序运行时将热点代码(经常执行的代码区域)编译成与本地平台相关的机器码,并且保存在本地。这样的话,当这些代码再次执行时就可以直接运行机器码,而不需要再次解释,从而大大提高了执行效率 。

即时编译的步骤:

  1. 热点探测:JIT编译器会监控哪些代码块(如方法或循环)被频繁执行,这些代码块被称为“热点代码”。

  2. 编译优化:当热点代码被识别后,JIT编译器会将这些代码编译成优化后的本地机器码。这个过程中,JIT编译器还会进行各种优化,比如内联展开、死码消除、循环优化等,以进一步提升性能。

  3. 代码替换:编译完成后,JVM会使用生成的机器码替换原先的字节码,之后的执行就不再需要解释器参与。

  4. 垃圾回收:即时编译生成的机器码也需要管理,当某部分代码不再是热点代码,或者JVM需要释放资源时,JIT编译器生成的机器码可能会被垃圾回收器清理掉。

2.常见的JVM:

  1. Oracle HotSpot JVM:这是目前最流行的JVM实现,是Oracle公司的产品。HotSpot JVM具有良好的性能和可靠性,并且具有广泛的平台支持。

  2. OpenJDK JVM:这是一个开源的JVM实现,是Oracle HotSpot JVM的基础。OpenJDK JVM由全球开发者社区维护和更新,提供了一种免费的Java运行环境。

  3. IBM JVM:这是IBM(国际商业机器公司)开发的JVM实现,具有较高的性能和可靠性。IBM JVM主要用于IBM的服务器和企业级应用程序。

  4. Azul Zing JVM:这是由Azul Systems开发的JVM实现,专注于提供卓越的性能和可伸缩性。Azul Zing JVM适用于高要求的应用程序,如金融交易系统和大规模数据处理。

  5. GraalVM:这是一种新型的JVM实现,由Oracle开发。GraalVM是一款高性能的JVM,同时还支持其他编程语言,如JavaScript、Python和Ruby。

我们可以使用cmd快速查看自己的虚拟机:

 这里标识我的虚拟机是 OpenJDK 11.0.16.1版本的Java虚拟机(JVM),并且它是64位的服务器版(Server VM)。这个特定的JVM构建是由Microsoft维护或构建的,支持混合模式执行(mixed mode),即能够在JIT编译模式和解释模式之间切换,以便在不同的场景下提供最佳性能。

3.JVM的组成部分:

  1. 类加载器子系统(Class Loader Subsystem)

    • 负责从文件系统或网络等来源加载Class文件,Class文件在文件形式中是以二进制流的形式存在的,类加载器读取这些字节流,并将其转换成方法区的运行时数据结构。
    • 在加载的过程中,类加载器还负责对字节码进行验证,确保其符合JVM规范,不会危害到JVM自身的安全。
    • 类加载器通常分为启动(Bootstrap)类加载器、扩展(Extension)类加载器和应用程序(Application)类加载器等。
  2. 运行时数据区(Runtime Data Areas)

    • 方法区(Method Area):存储每一个类的结构信息,如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容等。
    • 堆(Heap):JVM管理的最大一块内存区域,用于存放对象实例和数组,是垃圾收集器管理的主要区域。
    • 栈(Stacks:每个线程包含一个栈,用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法调用都会创建一个栈帧。
    • 程序计数器(Program Counter Register):每个线程都有一个程序计数器,是一块较小的内存空间,它指示了线程当前正在执行的JVM指令地址。
    • 本地方法栈(Native Method Stack):专门用于处理本地方法的调用。
  3. 执行引擎(Execution Engine)

    • 负责执行类文件中的指令。当执行引擎接收到字节码时,它会进行解释或编译(通过即时编译器,JIT)成为本地机器指令执行。
    • 包括解释器(Interpreter)和即时编译器(Just-In-Time Compiler, JIT)两部分。解释器快速解释执行字节码,而JIT编译器则可以提高性能,将热点代码(经常执行的代码)编译成与本地平台相关的机器码。
  4. 垃圾回收器(Garbage Collector)

    • 用于自动管理JVM内存,特别是堆内存的分配与释放。当对象不再被引用时,垃圾回收器会回收这些对象占用的内存空间,释放资源。
  5. 本地方法接口(JNI)与本地方法库(Native Libraries)

    • Java Native Interface(JNI)是一个框架,允许Java代码和其他语言写的代码互相调用,比如C/C++编写的应用程序或库。
    • 本地方法库是一组特定于特定操作系统的库,由JNI调用,用于执行那些不能直接用Java实现的任务。

JVM的这些组成部分共同工作,提供了一个完整、高效且稳定的Java运行时环境。通过不断地优化和改进这些组件,JVM能够支持高性能的并发和垃圾回收策略,同时确保了跨平台的可移植性和安全性。

总结:

        在本文中我们为大家介绍了JVM的基本组成和各个部分的功能,相信通过这一部分的讲解,大家已经能够理解JVM的作用。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

nacos启动报错 java.lang.RuntimeException: [db-load-error]load jdbc.properties error

以standalone mode sh startup.sh -m standalone 为例子 启动nacos 报错: Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcatat org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(To…

【九】linux下部署frp客户端服务端实践(内网穿透)

linux下部署frp客户端服务端实践 简介: 今天有一个这样的需求,部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了&#x…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器配置Nginx静态网页

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

网络安全威胁——中间人攻击

中间人攻击 1. 定义2. 中间人攻击如何工作3. 常见中间人攻击类型4. 如何防止中间人攻击 1. 定义 中间人攻击(Man-in-the-Middle Attack,简称MITM),是一种会话劫持攻击。攻击者作为中间人,劫持通信双方会话并操纵通信过…

生产环境_从数据到层级结构JSON:使用Spark构建多层次树形数据_父子关系生成

代码补充了!兄弟萌 造的样例数据 val data Seq(("USA", "Male", "Asian", "Chinese"),("USA", "Female", "Asian", "Chinese"),("USA", "Male", "Bl…

flask web学习之flask与http(一)

文章目录 一、请求响应循环二、HTTP请求1. 请求报文2. request对象3. 在flask中处理请求3.1 路由匹配3.2 设置监听的http方法3.3 URL处理 三、请求钩子 一、请求响应循环 每一个web应用都包含这种处理方式,请求-响应循环:客户端发出请求,服务…

Linux【缓冲区】

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻缓冲区是什么?为…

23、pytest通过skip跳过测试用例

官方实例 # content of test_skip.py import pytest import syspytest.mark.skip(reason"no way of currently testing this") def test_the_unknown():passdef valid_config():return Falsedef test_function():if not valid_config():pytest.skip("unsupport…

毕业论文及各种办公文件word页码的设置大全

当我们在写论文或者报告的时候,经常需要我们给文档设置页码,用于页码统计,也方便后期的查阅和阅读,但是经常遇到特殊的要求或者情况,比如删除了某个页的页码,那么整个文档目录的页码就会全部被删除&#xf…

Retrofit的转换器

一、前言 1.为什么要使用Retrofit转换器 在我们接受到服务器的响应后,目前无论是OkHttp还是Retrofit都只能接收到String字符串类型的数据,在实际开发中,我们经常需要对字符串进行解析将其转变为一个JavaBean对象,比如服务器响应…

【计算机网络笔记】物理层——信道与信道容量

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

静态VS动态代理IP:对比静态和动态代理IP的区别,如何选择?

在现代网络环境中,代理IP的作用不容小觑。它作为一种有效的网络工具,帮助用户在网上保持匿名性,同时还能绕过地理限制、提高安全性和增强数据收集的能力 在众多类型的代理IP中,静态和动态代理IP是最常见的两种形式。下面我们深入…

网络模拟与网络仿真

目录 一、概念界定 二、模拟(simulation)与仿真(emulation) 2.1 模拟(simulation) 2.2 仿真(emulation) 2.3 区分 三、网络模拟与网络仿真 3.1 网络模拟 3.2 网络仿真 3.…

properties出现中文乱码解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在使用Properties类的时候,中文出现乱码 如图所示: 正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式 通过下方的改动: 可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网…

持续集成交付CICD:Sonarqube 扫描本地项目(关联Gitlab项目与Jenkins流水线)

目录 一、实验 1.Java项目扫描 2.视图徽章 3.版本管理 一、实验 1.Java项目扫描 (1)指定项目信息关联的首页为GitLab项目,持续集成为Jenkins流水线 (2)命令行 sonar-scanner -Dsonar.host.urlhttp://192.168.20…

【算法】算法题-20231206

这里写目录标题 一、非自身以外数字的乘积二、最大数三、奇数排序 一、非自身以外数字的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀…

在eclipse中安装python插件:PyDev

在eclipse中安装插件PyDev,就可以在eclipse中开发python了。 PyDev的官网:https://www.pydev.org/ 不过可以直接在eclipse中用Marketplace安装(备注:有可能一次安装不成功,是因为下载太慢了,多试几次&…

极简模式,助力宏观数据监控

随着UWA GOT Online采样的参数越来越多样化,为了提升开发者的使用体验,我们最新推出了三种预设数据采集方案:极简模式、CPU模式、内存模式。该更新旨在降低多数据采集对数据准确性的干扰,同时也为大家提供更精准且有针对性的数据指…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Bolo开源博客

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

微软NativeApi-NtQuerySystemInformation

微软有一个比较实用的Native接口:NtQuerySystemInformation,具体可以参考微软msdn官方文档:NtQuerySystemInformation, 是一个系统函数,用于收集特定于所提供的指定种类的系统信息。ProcessHacker等工具使用NtQuerySys…