运行时数据区
Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。这些数据区域中的一些是在Java虚拟机启动时创建的,只有在Java虚拟机退出时才被销毁。其他数据区域是每个线程。每个线程数据区域是在线程退出时创建并销毁线程时创建的。
01 方法区
在jvm官网中说,方法区只有一个,属于线程共享的一块内存区域,生命周期是跟虚拟机一样的。它存储每类结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括在类和实例初始化以及接口初始化中使用的特殊方法
方法区域是在虚拟机启动时创建的。尽管方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不垃圾收集或压缩它。垃圾回收器不太会回收方法区的垃圾
如果方法区域中的内存无法满足分配请求,Java虚拟机将抛出OutOfMemoryError。
堆
Java虚拟机有一个堆,在所有Java虚拟机线程之间共享。堆是运行时数据区域,从中为所有类实例和数组分配内存
如果计算需要的堆比自动存储管理系统提供的堆多,Java虚拟机将抛出OutOfMemory错误
虚拟机栈
每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与线程同时创建。
它保存局部变量和部分结果,并在方法调用和返回中发挥作用。由于Java虚拟机堆栈除了推送和弹出帧之外从不直接操作,因此可以对帧进行堆分配。
程序计数器
每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法。如果该方法不是本机的,则pc寄存器包含当前正在执行的Java虚拟机指令的地址。如果线程当前执行的方法是本机的,则未定义Java虚拟机的pc寄存器的值。Java虚拟机的pc寄存器足够宽,可以在特定平台上保存一个returnAddress或一个本机指针。
参考文档
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
结束
更多内容请关注公众号获取!
——//////////——
专栏编辑:零壹小编 | 排版编辑:零壹小编
为IT人带来有价值有温度的阅读
来源:CSDN
作者:hansmall
链接:https://blog.csdn.net/hansmall/article/details/104196588