了解java虚拟机

说起java,不得不提到一个很重要的角色,那就是Java虚拟机。那么什么是java虚拟机呢?

java虚拟机是运行所有Java程序的抽象计算机,是Java语言的运行环境,是一个可以执行Java字节码的虚拟机进程。Java源文件,就是.java的文件,被编译成能被Java虚拟机执行的字节码文件,就是.class文件。只有安装了Java虚拟机,Java才能在操作平台上运行。

知道了什么是java虚拟机,那么它有什么特性?

最大的一个特性就是跨平台运行,java运行流程一般是:源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。

java虚拟机的体系结构,如下图所示

 

 

分为类加载器(用来装载.class文件)、运行时数据区(方法区、堆、java栈、程序寄存器、本地方法栈)、执行引擎(执行字节码,或者执行本地方法)。

下面对jvm运行时数据区做下了解:

1.程序计数器

 程序计数器是一块较小的内存空间,并且是线程私有的的内存。可以看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

如果线程正在执行一个java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器的值则为空。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2.Java虚拟机栈

是描述java方法执行的内存模型,也是线程私有的。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

栈帧是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接、方法返回值和异常分派。栈帧随着方法调用而创建,随着方法结束而销毁。

3.本地方法栈

与java虚拟机栈类似,线程私有。不同的是java虚拟机栈为执行java方法(字节码)服务,本地方法栈为虚拟机使用到的本地方法(Native)服务。有的虚拟机(如Sun HotsPot虚拟机)直接把本地方法栈和虚拟机栈合二为一。

4.Java堆

对大部分应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域。创建的对象和数组都保存在java堆内存中,也是垃圾收集器进行收集的最重要的内存区域。由于现代VM采用分代收集算法,因此Java堆从GC的角度还可以细分为:新生代和老年代。如果堆中没有内存完成实例分配,并且堆也无法在扩展时,将会抛出OutOfMemoryError异常。

5.方法区

为线程间共享,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展至方法区, 即使用Java堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存, 而不必为方法区开发专门的内存管理器(永久代的内存回收的主要目标是针对常量池的回收和类型的卸载, 因此收益一般小)。

运行时常量池 是方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池。用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。 Java 虚拟机对 Class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。

6.直接内存(Direct Memory)

直接内存并不是虚拟机运行时数据区的一部分,但是这部分内存被频繁使用,也可能导致OutOfMemoryError异常。

大小不受java堆大小限制,受本机(服务器)内存限制。

 

 

最后引用一篇某博客里的总结,说的也很形象,如下

1 虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。

2 这个叫做虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。

3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。

4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。

5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。

以上内容可能很抽象,我也并不是完全理解,只是在自己看过一遍相关文章,在总结,以后在回过头来看,可能会更理解。参考链接如下:

https://www.cnblogs.com/yixianyixian/p/7680321.html

https://www.cnblogs.com/IUbanana/p/7067362.html

《深入理解Java虚拟机JVM高级特性与最佳实践》一书。

猜你喜欢

转载自blog.csdn.net/cjy_win/article/details/88651776
今日推荐