浙江省建设工程质量管理协会网站,php购物网站开发开发多久,申请商标注册需要什么资料,淄博头条新闻今天✅作者简介#xff1a;大家好#xff0c;我是Leo#xff0c;热爱Java后端开发者#xff0c;一个想要与大家共同进步的男人#x1f609;#x1f609; #x1f34e;个人主页#xff1a;Leo的博客 #x1f49e;当前专栏#xff1a;每天一个知识点 ✨特色专栏#xff1a…✅作者简介大家好我是Leo热爱Java后端开发者一个想要与大家共同进步的男人 个人主页Leo的博客 当前专栏每天一个知识点 ✨特色专栏 MySQL学习 本文内容JVM规范中的运行时数据区 个人知识库 Leo知识库欢迎大家访问
JVM规范数据区
The pc Register程序计数器 是一块较小的内存空间此计数器记录的是正在执行的虚拟机字节码指令的地址Java Virtual Machine StacksJava虚拟机栈 Java虚拟机栈用于存储栈帧。栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。Heap堆 是Java虚拟机所管理的最大的一块内存。堆内存用于存放Java对象实例以及数组。堆是垃圾收集器收集垃圾的主要区域。Method Area方法区 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Run-Time Constant Pool运行时常量池 是方法区的一部分用于存放编译期生成的各种字面量与符号引用。Native Method Stacks本地方法栈 在本地方法的执行过程中会使用到本地方法栈。和 Java 虚拟机栈十分相似。
总结 这些运行时数据区虽然在功能上有所区别但在整个 Java 虚拟机启动时都需要被创建并且在虚拟机运行期间始终存在直到虚拟机停止运行时被销毁。同时不同的 JVM 实现对运行时数据区的分配和管理方式也可能不同会对性能和功能产生影响。
下图为JVM结构规范图该图属于JVM规范不是具体的实现。JVM规范最开始是由研究Java的大佬们定制的但是后面JVM规范的实现可能有很多公司比如我们最熟悉的Oracle等等这点一定要区分开。
JVM规范的实现HotSpotOracle JDK/Open JDK内部使用的JVM就是HotSpot JDK6的HotSpot
JDK6的HotSpot大致分为以下几个数据区。
年轻代 刚new出来的对象放在这里。老年代 经过垃圾回收之后仍然存活的对象。符号引用 类全名字段全名方法全名等。这个时期的永久代和堆是相邻的使用连续的物理内存但是内存空间是隔离的。永久代的垃圾收集是和老年代捆绑在一起的因此无论谁满了都会触发永久代和老年代的垃圾收集。 JDK7的HotSpot
以下是JDK7的HotSpot这是一个过渡的版本该版本相对于JDK6来说变化如下
类的静态变量转移到堆中了。这就是各个版本实现的不同在JVM规范以及JDK6来说类的静态变量是在方法区中而在JDK7中类的静态变量在堆内存中。字符串常量池转移到堆中了。运行时常量池中的符号引用转移到本地内存了。 JDK8的HotSpot
以下是JDK8及更高版本的HotSpot相对于JDK7来说发生了如下变化
彻底删除永久代 为了避免OOM错误的发生方法区更名为元空间。将方法区的实现转移到本地内存。将符号引用重新放回运行时常量池。