JVM规范中的运行时数据区

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉

🍎个人主页:Leo的博客

💞当前专栏:每天一个知识点

✨特色专栏: MySQL学习

🥭本文内容:JVM规范中的运行时数据区

📚个人知识库: Leo知识库,欢迎大家访问

JVM规范数据区

  1. The pc Register(程序计数器): 是一块较小的内存空间,此计数器记录的是正在执行的虚拟机字节码指令的地址;
  2. Java Virtual Machine Stacks(Java虚拟机栈): Java虚拟机栈用于存储栈帧。栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  3. Heap(堆): 是Java虚拟机所管理的最大的一块内存。堆内存用于存放Java对象实例以及数组。堆是垃圾收集器收集垃圾的主要区域。
  4. Method Area(方法区): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  5. Run-Time Constant Pool(运行时常量池): 是方法区的一部分,用于存放编译期生成的各种字面量与符号引用。
  6. Native Method Stacks(本地方法栈): 在本地方法的执行过程中,会使用到本地方法栈。和 Java 虚拟机栈十分相似。

总结: 这些运行时数据区虽然在功能上有所区别,但在整个 Java 虚拟机启动时都需要被创建,并且在虚拟机运行期间始终存在,直到虚拟机停止运行时被销毁。同时,不同的 JVM 实现对运行时数据区的分配和管理方式也可能不同,会对性能和功能产生影响。

下图为JVM结构规范图,该图属于JVM规范,不是具体的实现。JVM规范最开始是由研究Java的大佬们定制的,但是后面JVM规范的实现可能有很多公司,比如我们最熟悉的Oracle等等,这点一定要区分开。

JVM规范的实现:HotSpot(Oracle JDK/Open JDK内部使用的JVM就是HotSpot)

JDK6的HotSpot

JDK6的HotSpot大致分为以下几个数据区。

  • 年轻代: 刚new出来的对象放在这里。
  • 老年代: 经过垃圾回收之后仍然存活的对象。
  • 符号引用: 类全名,字段全名,方法全名等。
  • 这个时期的永久代和堆是相邻的,使用连续的物理内存,但是内存空间是隔离的。
  • 永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

JDK7的HotSpot

以下是JDK7的HotSpot,这是一个过渡的版本,该版本相对于JDK6来说,变化如下:

  1. 类的静态变量转移到堆中了。(这就是各个版本实现的不同,在JVM规范以及JDK6来说,类的静态变量是在方法区中,而在JDK7中,类的静态变量在堆内存中。)
  2. 字符串常量池转移到堆中了。
  3. 运行时常量池中的符号引用转移到本地内存了。

JDK8的HotSpot

以下是JDK8及更高版本的HotSpot,相对于JDK7来说发生了如下变化:

  1. 彻底删除永久代 (为了避免OOM错误的发生,方法区更名为元空间)
  2. 将方法区的实现转移到本地内存。
  3. 将符号引用重新放回运行时常量池。
相关推荐
ZzzK,2 小时前
JAVA虚拟机(JVM)
java·linux·jvm
西红柿维生素2 小时前
JVM相关总结
java·jvm·算法
老赵的博客6 小时前
c++ unqiue指针
java·jvm·c++
mkhase8 小时前
9.12-QT-基本登陆界面实现
java·jvm·qt
緈諨の約錠12 小时前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰12 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
Java进阶笔记12 小时前
JVM默认栈大小
java·jvm·后端
凤山老林1 天前
SpringBoot 轻量级一站式日志可视化与JVM监控
jvm·spring boot·后端
Boop_wu1 天前
[数据结构] 队列 (Queue)
java·jvm·算法
Chan161 天前
JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
java·jvm·spring boot·后端·intellij-idea