运行时数据区

发布时间:2022-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了运行时数据区脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1. 程序计数器

程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器

  • 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。各条线程之间的计数器互不影响,独立存储,即线程私有
  • 如果线程执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址
  • 如果线程执行的是一个本地方法,计数器的值为空
  • 程序计数器是唯一一个没有规定OutOfMemoryError情况的区域

2. Java虚拟机栈

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息

  • 虚拟机栈是线程私有的,它的生命周期和线程相同

  • 局部变量表中存放了编译器可知的各种Java虚拟机基本数据类型、对象引用、returnAddress类型【指向一条字节码指令的地址】

  • 这些数据类型在局部变量表中的存储空间以局部变量槽(slot)来表示,64位长度的long和double类型的数据占用两个变量槽,其余数据类型只占用一个。

  • 局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小【大小指的是变量槽的数量】。

3. 本地方法栈

本地方法栈发挥的作用与虚拟机栈类似,本地方法栈为虚拟机使用到的本地方法服务。

4. Java堆

堆是虚拟机管理的最大的内存,被所有线程所共享,在虚拟机启动时创建。

  • 从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB),以提升效率
  • Java堆可以处于物理上不连续的内存空间中,但是逻辑上应该被视为连续的
  • Java堆可以实现固定大小的,也可以是可扩展的(通过参数-Xmx和-Xms设定)

5. 方法区

方法区用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

  • 方法区与Java堆一样不需要连续的内存,并且可以选择固定大小或者可扩展
  • 方法区的内存回收目标主要针对常量池的回收和对类型的卸载

脚本宝典总结

以上是脚本宝典为你收集整理的运行时数据区全部内容,希望文章能够帮你解决运行时数据区所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: