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

前言: 

        在探索现代软件开发的丰富生态系统时,我们不可避免地会遇到一个强大而神秘的存在——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.mfbz.cn/a/221240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微前端 无界基本用法

目录 无界方案​ 应用加载机制和 js 沙箱机制​ 路由同步机制​ iframe 连接机制和 css 沙箱机制​ 通信机制​ 优势​ 无界入门 无界方案​ 在乾坤的issue中一个议题非常有意思,有个开发者提出能否利用iframe来实现js沙箱能力,这个idea启发了无…

EPWM初学笔记

时钟 PCLKCR0 PCLKCR1 EPWM总体预览 三部分就可以简单的使用EPWM 时基模块,比较模块,动作限定模块 时基模块 TBCTL时基控制寄存器 TBCTR计数寄存器 TBPHS相位寄存器 TBPRD周期寄存器 比较模块 CMPCTL比较控制寄存器 影子模式,加载模式 CMP…

nodejs+vue+elementui校园演出赞助艺术资源管理系统

系统主要分为系统管理员和学生、校外人员三个部分,系统管理员主要功能包括:首页、个人中心、学生管理、校外人员管理、社团信息管理、校内演出管理、校外商演管理、系统管理;基本上实现了整个基于vue的校园艺术资源管理系统的设计与实现信息管…

Linix服务器添加dns解析

Linix开通互联网域名地址出现,如下错误: 需要访问的服务器上添加dns解析 vim /etc/sysconfig/network-scripts/ifcfg-ens192 添加如下配置: DNS1202.96.134.13 重启网卡: systemctl restart network 注意如果是docker服务部署…

STM32(PWM、ADC)

1、PWM 定义 PWM,全称为脉冲宽度调制(Pulse Width Modulation),它通过改变信号的高电平和低电平的持续时间比例来控制输出信号的平均功率或电压。 PWM,全称为脉冲宽度调制(Pulse Width Modulation&#xff…

【SQL 基础教程】w3school-SQL-基础知识-总结笔记

SQL-基础-笔记 一、简介 1:什么是 SQL? SQL 是用于访问和处理数据库的标准的计算机语言。 SQL 指结构化查询语言 SQL 使我们有能力访问数据库 SQL 是一种 ANSI 的标准计算机语言 2:SQL 能做什么? SQL 可在数据库中插入新的记录、删…

css实现姓名两端对齐

1.1 效果 1.2 主要代码 text-align-last: justify; 1.3 html完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

数据结构之插入排序

目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中&#xff0c;我们不经意间会遇到很多排序的场景&#xff0c;比如在某宝&#xff0c;某东上买东西&#xff0c;我们可以自己自定义价格是由高到低还是由低到高&#xff0c;再比如在王者某…

机器连接和工业边缘计算

软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合&#xff0c;并采用架构蓝图和最佳实践来满足最终用户的需求。此外&#xff0c;边缘计算&#xff08;Edge Computing&#xff09;也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…

设计模式篇之创建型模式

目录 前言一、简单工厂模式二、工厂方法模式总结 前言 最近开始整理Java设计模式&#xff0c;本篇主要分享设计模式中的创建型模式&#xff0c;并给出demo代码&#xff0c;适合初中级开发学习。分享书籍《大话设计模式》&#xff0c;分享GitHub学习设计模式仓库。 一、简单工厂…

Zookeeper(服务注册中心)安装以及启动服务

概述 ZooKeeper是一个分布式的开源协调服务&#xff0c;用于管理和协调大规模分布式系统中的各种任务。它提供了一个简单的分层命名空间&#xff0c;以及对数据的强一致性&#xff08;ACID特性&#xff09;和高可用性的支持。 ZooKeeper提供了一个类似文件系统的层次结构&…

智能优化算法应用:基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混沌博弈算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混沌博弈算法4.实验参数设定5.算法结果6.参考…

从零开始的Spring Cloud Gateway指南:构建强大微服务架构

目录 一、 什么是Gateway&#xff1f;1. 网关的由来2. 网关的作用3. 网关的技术实现 二、如何搭建一个简易网关服务1. 引入依赖2. 配置yml文件 三、进阶话题&#xff1a;过滤器和路由配置1. gateway的执行原理2. 路由断言工厂: Predicate Factory3. 网关过滤器&#xff1a;Gate…

UE Windows平台下Linux的交叉编译项目打包

UE Windows平台下Linux的交叉编译项目打包 交叉编译&#xff08;Cross-compilation&#xff09; 使得在以Windows为中心的工作流程中工作的游戏开发者能够以Linux为目标对项目进行打包。目前&#xff0c;只有Windows支持交叉编译。 交叉编译支持的平台 Windows | Linux-x86_…

java8 常用code

文章目录 前言一、lambda1. 排序1.1 按照对象属性排序&#xff1a;1.2 字符串List排序&#xff1a;1.3 数据库排序jpa 2. 聚合2.1 基本聚合&#xff08;返回对象list&#xff09;2.2 多字段组合聚合&#xff08;直接返回对象list数量&#xff09; 二、基础语法2.1 List2.1.1 数…

附录B 存储次层次结构回顾

1. 引言 缓存是指地址离开处理器后遇到的最高级或第一级存储器层次结构。 如果处理器在缓存中找到了所请求的数据项&#xff0c;就说发生了缓存命中。如果处理器没有在缓存中找到所请求的数据项&#xff0c;就说发生了缓存缺失。此时&#xff0c;包含所请求的字的固定大小的数…

五年制专转本经验分享

五年制专转本经验分享 提早设定学习目标&#xff0c;会让你努力更有方向&#xff01;同学们在大一、大二时不要以为专转本离你还很远&#xff0c;时际上根据我们十多年的培训经验来说&#xff0c;专转本备考越早准备越有利于通过&#xff01;大家知道英语科目的话&#xff0c;在…

LeetCode437.路径总和III

看完题目我就拿直接用递归写了如下代码&#xff1a; class Solution {private int ans;public int pathSum(TreeNode root, int targetSum) {ans 0;dfs(root, targetSum, 0);return ans;}public void dfs(TreeNode root, int targetSum, int sum){if(root null)return;sum r…

Python中判定列表是否包含某个元素的方法

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python中判定列表是否包含某个元素的方法&#xff0c;全文4000字&#xff0c;阅读大约10分钟。 在Python编程中&#xff0c;判定一个列表是否包含特定元素是一项常见任务。本…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…
最新文章