【从零开始学习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.mzph.cn/news/200637.shtml

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

相关文章

WPS Office JS宏实现批量处理Word中的标题和正文的样式

该篇讲解下word文档中的标题和正文批量修改样式,如下图: 前面一篇已讲解了WPS Office宏编辑器操作方法,这里不细讲了,如有不清楚可以查看该篇:https://blog.csdn.net/jiciqiang/article/details/134653657?spm1001.20…

Install4J安装界面中如何使用脚本找到依赖程序XShell的安装位置

前言 写了一个工具, 使用Install4j打包, 但因为需要用到XShell, 所以希望在安装界面能够提前让用户配置好XShell的安装位置, 所以对Install4j的安装界面需要自定义, 后期在程序中直接过去安装位置就可以正常使用. 调研 和git-bash不一样, 安装版的XShell没有在注册表里存储安…

Ubuntu系统下使用apt-get安装Redis

记录一下Ubuntu20.04 64位系统下使用apt-get安装Redis 首先检查一下系统是否安装过redis whereis redismywmyw-K84HR:~$ whereis redis redis: mywmyw-K84HR:~$ 更新软件包 sudo apt-get update -y安装redis sudo apt-get install redis-server -ymywmyw-K84HR:~$ sudo apt…

Java常见CodeReview及编码规范

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录. 1.数据库 如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候. 除配置表以外的sql都要经过expl…

Learning Memory-guided Normality for Anomaly Detection 论文阅读

Learning Memory-guided Normality for Anomaly Detection 摘要1.介绍2.相关工作3.方法3.1网络架构3.1.1 Encoder and decoder3.1.2 Memory 3.2. Training loss3.3. Abnormality score 4.实验5.总结总结&代码复现: 文章信息: 发表于:cvpr…

消息中间件之间的区别

一.单机吞吐量 ActiveMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RabbitMQ:万级,吞吐量比RocketMQ和Kafka要低了一个数量级 RocketMQ:10万级,RocketMQ也是可以支撑高吞吐的一种MQ Kafka&#xff…

Python的requests库实现HTTPS

嘿,Python程序员们!今天我们要来点刺激的——使用Python的requests库实现HTTPS请求!是的,你没有听错,我们要一起迈入HTTPS的神秘世界! 首先,我们来了解一下HTTPS是什么。HTTPS是HTTP Secure的缩…

BUU SQL COURSE 1

四 发现有登录框,爆破半天也爆破不出来,只能从别的地方下手了 F12一下 发现了一个传参 进去发现id可以传参,sql注入一下试试 前三个都有回显,当id4的时候页面没有回显了,正好验证 了页面 有三个新闻 当order by 3的时…

ROS-ROS通信机制-服务通信

文章目录 一、服务通信基本知识二、自定义srv三、C实现四、Python实现 一、服务通信基本知识 服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即: 一个节点A向另一个节点B发送请求,B接收处理请求…

我想修改vCenter IP地址

部署vCenter Server Appliance后,您可以在vCenter修改DNS设置并选择域名服务器使用。您可以编辑vCenter Server Appliance的IP地址设置。从vSphere 6.5开始正式支持vCenter修改IP地址。因此可以更改vCenter Server Appliance的IP地址和DNS设置。 注意:更…

Vue--第六天

vuex概述: 组件通信感觉有点白雪。。。。。。。。。。 创建项目: 为了学习简介,先选几个,后续是要勾选很多的 建好后再进行组件导入 创建空仓库: 使用: 上面是store访问,下面是辅助函数的方式…

centos 7.9 二进制部署 kubernetes v1.27.7

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

HarmonyOS学习--TypeScript语言学习(二)

本章目录如下: 一、基础类型 二、运算符 三、变量声明 四、类型断言 五、类型推断 TypeScript支持一些基础的数据类型,如布尔型、数组、字符串等,下文举例几个较为常用的数据类型,我们来了解下他们的基本使用。 关于let 我们…

ctfshow sql 186-190

186大小写绕过 1 order by 3-- 发现union select被过滤,用大小写来绕过 1 union seleCT 1,2,database() --1 union seleCT 1,2,table_name from information_schema.tables where table_schemactfshow_web --1 union seleCT 1,2,column_name from information_schem…

Postman和Apifox针对不同环境、全局变量的使用与比较

文章目录 一、Postman1、配置环境和全局变量2、验证3、存在问题分析 二、Apifox1、配置环境和全局参数2、创建公共脚本3、测试 总结 一、Postman 1、配置环境和全局变量 在Postman的界面中,点击"Environment",添加我们需要的环境&#xff0c…

数据库管理-第123期 Oracle相关两个参数(202301205)

数据库管理-第123期 Oracle相关两个参数(202301205) 最近在群聊中看到俩和Oracle数据库相关的俩参数,一个是Oracle数据库本身的,一个是来自于Weblogic的,挺有趣的,本期研究一下。(本期涉及参数…

ppt转换成pdf文件

最近用到了,记一下; ppt转pdf分为两种情况: 小于2007版本的 .ppt格式(2003) 与大于2007版本的 .pptx格式(2007) .ppt格式为 二进制文件 .pptx格式为xml格式,在java中有不同的jar包需要使用 引入…

uniapp踩坑之项目:使用过滤器将时间格式化为特定格式

利用filters过滤器对数据直接进行格式化&#xff0c;注意&#xff1a;与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为&#xff1a;2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…

springboot 集成Dubbo2.7.8 ,连接zookeeper 提示错误 zookeeper not connected

Dubbo 连接zookeeper时&#xff0c;提示“zookeeper not connected” java.lang.IllegalStateException: zookeeper not connectedat org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:83) ~[dubbo-2.7.8.jar:2.…

MySQL5 和 MySQL8 的配置区别 一些注意事项

1、使用命令行查看MySQL的版本 先保证你的mysql正在运行&#xff0c;假如用户名是root&#xff0c;密码是123456&#xff0c;运行下边的代码可以查看mysql的版本号。 mysql -uroot -p123456这里我的版本是5.7.19。也就是5版本的。 2、不同版本对应的数据库驱动jar包&#x…