Java 虚拟机

简介

  • java虚拟机是一台执行java字节码的虚拟计算机,它拥有独立的运行机制。注意它运行的字节码文件也未必有java语言编译而成。
  • JVM平台的各种语言可以共享java虚拟机带来的跨平台性、优秀的垃圾回收器、可靠的即时编译器。
  • Java技术的核心技术就是JVM,因为所有的java程序都运行在java虚拟机的内部。

作用

java虚拟机就是二进制字节码的运行环境。负责装载字节码到其内部,解释/编译为对应平台上的机器指令。每一条Java指令,JVM规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里等。

特点

  • 一次编译,到处运行。
  • 自动内存管理。
  • 自动垃圾回收功能。

JVM的位置

JVM是运行在操作系统之上的,它与硬件没有直接的联系。

JVM的体系结构

程序计数器(Program Counter Register)

每一个线程都有一个程序计数器,是线程所私有。就是一个指针,是一个非常小的内存空间。用来保证程序按照顺序执行。

方法区(Method Area)

别名非堆(Non-Heap),也是我们所说的永久代(Permanent Generation),方法区被所有的线程所共享的区域,用于存储已经被JVM加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

HotSpot VM把GC分代收集扩展至方法区, 即使用Java 堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存, 而不必为方法区开发专门的内存管理器(永久带的内存回收的主要目标是针对常量池的回收类型 的卸载, 因此收益一般很小)。

常量池(Runtime Constant Pool)

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

静态变量(static)常量(final)类的信息(构造方法、接口定义)运行时常量池都存在于方法区中,但是实例变量存在于堆内存中,和方法区无关。

虚拟机栈(Stack

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

此图像的alt属性为空;文件名为image-51.png

局部变量表存放的内容如下:

  1. 八大基本数据类型:boolean、byte、char、short、int、float、long、double。
  2. 对象的引用类型:指向对象初始地址的一个指针,此处不是具体的对象。
  3. returnAddress类型:指向了一条字节码指令的地址。

本地方法栈(Native Method Stack)

用来登记native关键字声明的方法。被Native关键字声明的方法,说明此方法的实现是Java的能力范围之外的。需要底层去调用C语言的库。

声明了Native的方法在加载的时候,会进入本地方法栈(用来登记Native方法),由本地方法栈通过本地方法接口(JNI)调用本地方法库

JNI:扩展Java的使用,融合不同的编程语言为Java所用。设计的初期主要是想融合C、C++。

堆(Heap-线程共享)-运行时数据区

是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行 垃圾收集的最重要的内存区域。由于现代 VM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以 细分为: 新生代(Eden 区From Survivor 区To Survivor 区)和老年代。

最后修改日期:2020-07-12

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。