qidao123.com技术社区-IT企服评测·应用市场

标题: JVM规范之运行时数据区域 [打印本页]

作者: 缠丝猫    时间: 前天 18:00
标题: JVM规范之运行时数据区域
媒介

为什么要阅读jvm规范?

阅读本篇文章可以学习到啥?

本篇文章根据jvm8规范的 §2.5编写,阅读本篇文章可以简朴相识JVM的运行时数据区包含哪些部分,相识各个部分的角色和功能,方便后续更加深入地学习JVM关于运行时数据区的细节。
正文

概述

JVM中定义了多种运行时数据区域,但是按照生命周期可以分为两种,一种是跟随JVM启动创建和烧毁的,另一种则是跟随线程创建和烧毁的,每个内存区域都有自己的职责,相互之间也并不是完全的隔离的状态,存在包含关系,jvm对于内存的管理的实现并没有做严格的限制,这也为JVM的实现提供充足的灵活性和扩展性。
JVM线程私有的运行时数据区

pc(program counter) Register

JVM支持多线程同时运行,每个JVM线程都有自己的pc Register,用于记录当前正在执行的字节码指令地点,在任意时刻,一个JVM线程都正在运行一个方法中的字节码指令,对于pc寄存器中存储的内容,包含两种情况:

因此,JVM要求pc Register的宽度必须在特定的平台上充足容纳returnAddress和本地指针宽度
增补

JVM Stack

JVM Stack,即Java虚拟机栈,每个JVM线程都独立拥有JVM Stack,它随JVM线程创建而创建,随线程烧毁而烧毁,栈中存储的是帧,和传统编程语言C很类似,栈用来保存局部变量、中心结果,也用于保存方法调用和返回的上下文信息
JVM并不会直接操作栈,只能通过方法的调用和返回间接进行压栈和出栈的操作;有一点区别是,传统语言中栈通常是一段连续的内存空间,但是JVM并没有同样的要求,栈帧也可以在堆上进行分配,因此,可以更加充实的使用碎片化的内存空间;
JVM Stack的空间巨细有两种设计:

关于Java虚拟机栈的两种异常情况:

Native Method Stack

本地方法栈,本地方法是使用非Java语言编写的,用于实现Java和其他编程语言进行交互,但这并不是一个必须的模块,根据用户的实际情况而定;

本地方法栈空间巨细的设计:

关于本地方法栈的异常情况:

JVM线程共享的运行时数据区

Heap

Heap,即堆,是所有JVM线程共享的一块内存空间,当JVM启动时创建,所有的对象实例和数组都会从堆上分配空间,对象占用的内存从来都不会显式地被开释,而是通过自动存储管理系统进行回收,也就是大名鼎鼎的GC(garbage collector);关于自动存储管理系统,JVM并没有假设任何类型的内存管理系统,而是让实现者根据自己的需求选择相应的内存管理技术;
JVM Heap的空间巨细有两种设计:

关于堆异常的情况:

Method Area

Method Area,即方法区,所有的JVM线程共享的一块内存区域,方法区的概念和操作系统进程中的代码段(text segment)有些相似,方法区存储了每个类的布局,比如运行时常量池、字段信息等,还有方法和构造器的指令代码;
方法区在JVM启动时创建,从逻辑上讲,方法区是堆的一部分,但是一种简朴的实现是既不使用GC进行垃圾回收也不会对它进行压缩,JVM规范并没有指定要求方法区的位置和字节码指令的管理策略;
方法区的内存空间巨细设计:

关于方法区的异常情况:

Run-time constant pool

运行时常量池,是从方法区分配的一部分内存空间,是每个类或者接口对应的calss文件中的常量池表,常量池中保存了各种常量,包括数值字面量和字段引用,和传统编程语言中的符号表有点类似,
当一个类或者接口被创建时,运行时常量池也会被创建。
运行时常量池异常的情况:

总结

本篇文章根据JVM8规范,总结了6种JVM运行时数据区,按照线程私有和全局共享,分成两类:
线程私有的运行时数据区:

线程共享的运行时数据区:

参考链接

jvm8s

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4