JAVA全栈JVM篇————初识JVM

🍏🍏🍏一.JVM到底是什么

Java全称java virtual machine,中文译名Java虚拟机,本质上是一个运行在计算机上的程序,职责是运行java字节码文件

🍏🍏🍏二.JVM的作用------------机器世界的翻译官

字节码文件中包含了一连串的指令,我们称之为字节码指令,这些指令无法直接在计算机上运行,计算机只能识别机器码的内容,所以java虚拟机就需要将字节码转换成机器码,这个过程称为解释,类似于将一门语言翻译成另外一门语言的过程

🍏🍏🍏三.JVM的三大核心功能

其中内存管理是JVM相比于C和C++的一大优势,c和c++对象的回收需要程序员手动写代码,对程序员水平要求极高,如果不小心忘记,这个对象就会永远在内存中存在,不会再回收,而jvm的出现降低了程序员编程的难度,下面来重点介绍一下JVM的即时编译功能

🍏🍏🍏四.全面看待JVM---------哪有什么完美无暇,只是一种取舍罢了

下图是JVM同C和C++的编译过程对比图

🍬 在不做任何优化的前提下,java语言需要将字节码指令,实时的通过java虚拟机解释成机器码,才可以交给计算机运行,这个过程随着程序的执行需要反复进行,每一次进行都会花费一定的时间。

🍬相比之下,c和c加加在编译过程中可以直接将源代码文件转换成计算机认可的机器码,只要运行机器码就可以得到最终的结果,节省了解释的过程,这样java的性能就不如c和c++了。

实时解释是为了支持跨平台特性,java语言将字节码交给不同的平台比如windows和linux,这些平台会安装不一样的java虚拟机,他们分别将它解释成当前这个平台的机器码,然后就可以交给不同的操作系统运行从而实现跨平台。

🍬c和c加加追求性能,但是不能跨平台,java支持跨平台,性能就会差一些,但是好在JVM开发者很早的就注意到这个问题,在jdk1.1版本中就引入了即时编译功能

🍬假设现在有一个Java字节码文件,里面有一段字节码指令,虚拟机如果发现这段指令是热点代码,也就是在很短时间内被多次调用,它就会认为这段代码有必要去优化,就会主动优化并且解释成计算机能够执行的机器码,然后做一个非常关键的步骤,将这个机器码保存在内存中,第二次执行时就直接从内存中把这个机器码取出来直接进行调用,这样就省略了一次解释的步骤,提高了性能。如下图所示

🍬这样JVM提供即时编译(JIT)进行性能的优化,最终达到接近C,C++语言的运行性能甚至在特定场景下实现超越。

🍬那你是不是以为真的jvm就完全碾压C和C++了,那就大错特错了,前面说到JAVA会把代码存入内存,第二次直接调用,省去了一次解释的时间,但是也占用了内存,本质上是以空间换时间的思想,所以大多数java程序都很占内存

🍬所以说没有天生完美的语言,只有权衡利弊后的取舍罢了

🍏🍏🍏五.JVM的组成

类加载器 :加载class字节码文件中的内容到内存中
内存区 :负责管理JVM使用到的内存,比如创建对象和销毁对象
执行引擎 :将字节码文件中的指令解释成机器码,同时使用即时编译器优化性能,还可以调用本地接口
本地接口:调用本地已经编译的方法,比如线程类中提供的像线程休眠这种的C和C++方法

🍏🍏🍏六.JVM的发展历程

🍏🍏🍏七.不同版本的JVM之间的区别

🍬🍬🍬第一款(Oracle JDK)作为安装jdk时的默认虚拟机,社区最为活跃,使用也最为广泛,如下图,我们查看可以发现我们的电脑装的是HotSpot版本的虚拟机

🍬🍬🍬第二款(Open JDK)相比较于第一款,优点是开源,如果需要二次开发,增强虚拟机功能时更为适合,第一款虚拟机不开源,无法修改源代码,两款虚拟机垃圾回收器略有区别,其余大致相同

🍬🍬🍬第三款:基于HotSpot上的一款支持多语言混合开发(ruby,python等)的虚拟机,适用于微服务和云原生架构

🍬🍬🍬第四款:对高并发系统进行大量优化,安全性也有所提升,适合高并发,高性能要求的场景

🍬🍬🍬第五款:大多为IBM内部使用,设计初衷也是追求高性能和可扩展

🍏🍏🍏八.JVM规范

官网地址:https://docs.oracle.com/javase/specs/index.html

作用:对不同的虚拟机发行版本做一个统一的规范

只要其他语言能生成符合规范的class字节码文件,一样可以借助JVM运行,这在兼具标准性的同时也体现了虚拟机的灵活性。

相关推荐
我命由我123453 小时前
PDFBox - PDFBox 加载 PDF 异常清单(数据为 null、数据为空、数据异常、文件为 null、文件不存在、文件异常)
java·服务器·后端·java-ee·pdf·intellij-idea·intellij idea
7哥♡ۣۖᝰꫛꫀꪝۣℋ4 小时前
Spring Boot
java·spring boot·后端
Moniane4 小时前
C++深度解析:从核心特性到现代编程实践
java·开发语言·jvm
uxiang_blog4 小时前
C++进阶:重载类型转换
linux·开发语言·c++
攻城狮CSU4 小时前
C# 数据加载专题 之泛型序列化
java·servlet·c#
浩泽学编程4 小时前
【源码深度 第1篇】LinkedList:双向链表的设计与实现
java·数据结构·后端·链表·jdk
哲此一生9844 小时前
创建一个SpringBoot项目(连接数据库)
java·spring boot·后端
文心快码BaiduComate4 小时前
Comate Zulu实测:不会编程也能做软件?AI程序员现状令人震惊
java·程序员·前端框架
爱编程的鱼4 小时前
C# 参数详解:从基础传参到高级应用
开发语言·microsoft·c#