当前位置: 首页 > 图灵资讯 > 技术篇> 深入浅出学习JVM基础知识

深入浅出学习JVM基础知识

来源:图灵教育
时间:2023-04-07 10:21:53

JVMJava Virtual MachineJVM是一种虚拟机,也是Java虚拟机(Java虚拟机)的缩写的标准。JVM作为Java的核心部分,在学习Java的过程中,必然要学习JVM基础知识,本文为大家揭开神秘的JVM面纱。

首先,我们必须彻底弄清楚JVM的概念:它是一种虚构的计算机,通过在实际计算机上模拟各种计算机功能来实现。它遵循着冯·在冯中,诺依曼系统结构的设计原则·在诺依曼系统结构中,指出计算机处理的数据和指令是二进制数,存储在同一存储器中,并按顺序执行。指令由操作代码和地址代码组成 操作代码决定了操作类型和数字类型,地址代码指出了地址代码和操作数。从dos到window8,从unix到ubuntu和centos, 还有MAC OS等,不同的操作系统指令集和数据结构不同,JVM定义了一套统一的数据结构和操作指令,通过在操作系统上建立虚拟机,使用相同的语言 将言语翻译成各大主流操作系统,实现跨平台操作,可以说 JVM是java的核心,是java一次编译到处运行的本质。

弄懂在JVM的概念之后,我们来谈谈它的系统结构:

众所周知JDKJDK的一部分是JRE,JRE是JAVA的运行环境,JVM是JRE的核心部分。以下是JDK在oracle官方网站上的JDK Standard Edtion的组成图:

从图中可以看到底层的位置JVM重要,在实际项目中JAVA应用的性能优化、OOM等异常处理最终必须来自JVM得到解决。 与IBM、HP等厂商开发的JVM不同,HotSpot是Oracle关于JVM的商标。Java HotSpot Client VM和Java HotSpot Server VM是JDK关于JVM的两种不同实现。前者可以减少启动时间和内存占用,而后者可以提供更好的程序运行速度

每个Java程序离不开Java虚拟机。Java程序的运行取决于具体的Java虚拟机实例。在Java虚拟机规范中,用子系统、内存区域、数据类型和指令来描述。这些组成部分共同显示了抽象虚拟机内部的抽象系统结构。JVM主要由五个模块组成:类装载器子系统(ClassLoader)、运行时的数据区(Native Interface)、执行引擎(Execution Engine )、本地方法界面(Native Interface)以及垃圾收集模块。垃圾收集模块在其中Java虚拟机规范并不要求Java虚拟机收集垃圾,但在发明无限内存之前,大多数Java实现垃圾收集。在运行过程中,数据区域将以某种形式存在于每个Java虚拟机实例中,但Java虚拟机规范对其的描述相当抽象。数据结构中的大多数细节都是由具体的设计师决定的。下图为JVM结构图:

1. ClassLoader 负责加载class文件 , class文件在文件开头有一个特定的文件标记 , 而且classloader只负责class文件的加载 , 至于它是否能运行,Execution是由Execution决定的 Engine决定。

2.Native Interface 本地接口的调用负责。他的功能是用不同语言的界面为JAVA使用JAVA , 他将在Native Method 在Stack中记录相应的本地方法 , 然后通过Execution调用此方法 Engine加载相应的本地lib。最初,它多用于一些专业领域 , 如JAVA驱动 , 地图制作引擎等 , 目前,这种本地方法界面的调用类似于Socket通信 , WebService等替代方法。

3.Execution Engine 是执行引擎 , 也叫Interpreter。加载Class文件后 , 将指令和数据信息放入内存中,Execution Engine负责向操作系统解释这些命令。

4.Runtime Data Area 存储数据, 分为五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。几乎所有关于java内存的问题 ,都集中在这一块上。

Java虚拟机不是真正的物理机器,它没有寄存器,所以指令集使用Java堆栈存储中间数据,目的是保持Java虚拟机指令集尽可能紧凑,但也方便Java虚拟机在那些只有少数通用寄存器的平台上。此外,基于堆栈的JAVA虚拟机的系统结构有助于优化一些虚拟机在运行过程中实现的动态编译器和即时编译器的代码。

Java语言的一个非常重要的特点是与平台无关。使用Java虚拟机是实现这一特性的关键。一般的高级语言要想在不同的平台上运行,至少需要编译成不同的目标代码。Java语言虚拟机引入后,Java语言不需要在不同的平台上重新编译。Java语言使用模式Java虚拟机屏蔽了与特定平台相关的信息,使Java语言编译程序能够在不经修改的情况下在各种平台上运行,只需在Java虚拟机上生成目标代码(字节码)。Java虚拟机在执行字节码时,将字节码解释为特定平台上的机器指令。

必须提到的另一点是,碎片回收机制JVM。Java实例所需的存储空间分布在堆上。解释器具体承担类实例分配空间的工作。在为实例分配存储空间后,解释器开始记录实例占用的内存区域的使用情况。物体一旦使用完毕,就会回收到堆中。在Java语言中,除new语句外,没有其他方法可以申请和释放一个对象的内存。Java操作系统负责内存的释放和回收。这允许Java操作系统的设计师自己决定碎片回收的方法。Java解释器和Hot在SUN公司开发 在Java环境中,碎片回收采用后台线程进行。这不仅为操作系统提供了良好的性能,而且使程序设计师摆脱了控制内存使用的风险。

总的来说,JVM的系统知识体系仍然有一个相对较大的知识网络。在这篇文章中,我们只是简单地学习了一些JVM的基本知识。那些想要完全掌握JVM的人可以蛙课网学习更多的java知识。