动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

深入浅出学习JVM基础知识

06-29 17:48 573浏览
举报 T字号
  • 大字
  • 中字
  • 小字

JVMJava Virtual Machine(Java虚拟机)的缩写,JVM是虚拟机,也是一种规范。JVM作为java的核心部分,我们在学习java的过程中,不可避免地要学习JVM基础知识,本文为大家揭开JVM的神秘面纱。

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

弄懂JVM的概念之后,我们来说一下它的体系结构:

众所周知JDKjava开发的必备工具箱,JDK其中有一部分是JRE,JRE是JAVA运行环境,而JVM则是JRE最核心的部分。下面是oracle官网上JDK Standard Edtion的组成图:

 

从图中最底层的位置可以看出来JVM重要,而实际项目中JAVA应用的性能优化,OOM等异常的处理最终都得从JVM这儿得到解决。 HotSpot是Oracle关于JVM的商标,区别于IBM,HP等厂商开发的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虚拟机垃圾收集,但是在没有发明无限的内存之前,大多数JVM实现都是有垃圾收集的。而运行时数据区都会以某种形式存在于每一个JAVA虚拟机实例中,但是Java虚拟机规范对它的描述却是相当抽象。这些运行时数据结构上的细节,大多数都由具体实现的设计者决定的。下图是JVM的结构图:

1. ClassLoader 是负责加载class文件 , class文件在文件开头有特定的文件标示 , 并且ClassLoader只负责class文件的加载 , 至于它是否可以运行,则由Execution Engine决定。

2.Native Interface 是负责调用本地接口的。他的作用是调用不同语言的接口给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运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。

总的来说,JVM的系统知识体系还是有比较庞大的知识网的,本文中我们只是深入浅出地地学习了一些jvm基本知识。想要完全掌握JVM的小伙伴可以在蛙课网学习更多的java知识。

0人推荐
共同学习,写下你的评论
0条评论
轻言绕指柔
程序员轻言绕指柔

14篇文章贡献84145字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消