JVM运行时数据区有哪些?

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

jvm 在运行时数据区有哪些?

首先我们要知道运行时数据区是什么,运行时数据区的定义是这样的:java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这部分数据区域就是运行时数据区。
然后根据 jvm 规范,标准的 jvm 的运行时数据区应该包含以下部分:
1、程序计数器
2、虚拟机栈
3、本地方法栈
4、堆内存
5、方法区
6、运行时常量池

可以发现其实这部分运行时数据区和 jvm 的基本结构有很多相似之处但也只是有部分相似,运行时数据区应该是下面这个样子:

image.png

一般来说运行时数据区可以划分为线程共享区和线程私有区两个大区域。
在线程私有区域中 java 程序每启动一次线程它都会创建一个 虚拟机栈、本地方法栈、程序计数器。
启动多个线程但在 jvm 中只存储一份的就是线程共享区域,比如堆空间、方法区、运行时常量池。\

当然这是只是 jvm 规范中理想状态下的情况,具体的 jvm 实现会根据实际的情况去进行合并、优化,只要满足对应的规范要求就行。这个该怎么理解呢,就是说以上的这些东西在运行时数据区中只要存在了就行了,不一定要按照以上这样的方式去进行分配。
比如我们java程序员最常用的虚拟机 Hotspot JVM 它就是把本地方法栈和虚拟机栈合二为一的进行实现,并没有完全按照 jvm 的规范进行实现。
jvm 规范就像是接口,对应的虚拟机就像是接口的具体实现。