Java杂记之JVM内存模型

1.运行时数据区

在运行Java程序的时候,JVM需要使用内存存放各式各样的数据,JVM规范将这部分内存区域叫做运行时数据区

运行时数据区可以分为两类:

  • 多线程共享的

    这部分需要在JVM启动的时候创建好,在JVM退出的时候销毁。

  • 线程私有的

    这部分是在线程创建的时候创建,线程结束的时候销毁。

2.多线程共享内存

多线程共享内存区域主要存放两大类数据:

  • 类数据

    类数据(包括字段和方法信息、方法的字节码、运行时常量池,等等)存放在方法区(Method Area)中。

  • 类实例(也就是对象)

    实例数据存放在堆(Heap)中。堆由垃圾回收器定期进行清理(JVM的垃圾回收也就主要作用在该区域),所以程序员不需要关心对象空间的释放。
    可以通过-Xmx和-Xms控制堆的大小

PS:从逻辑上来讲,方法区其实也是堆的一部分

3.线程私有内存

线程私有内存区域主要的作用是用于辅助执行Java字节码。每个线程都有自己的pc寄存器(Program Counter)和Java虚拟机栈(JVM Stack)。Java虚拟机栈又由栈帧(Stack Frame,简称帧)
构成。帧中保存方法的执行状态,包括局部变量表(Local Variable)和操作数栈(Operand Stack)等。在任意一个时刻,一个线程肯定在执行一个方法。这个方法叫做该线程的当前方法;
执行该方法的帧叫做线程的当前帧;声明该方法的类叫做当前类。如果方法是Java方法,则pc寄存器中存放当前正在执行的Java虚拟机指令的地址,否则,当前方法是一个本地方法,pc
寄存器中的值没有明确的含义。

根据如上描述,可以大致勾勒出运行时数据区的逻辑结构如下:

猜你喜欢

转载自www.cnblogs.com/wuqinghua-blog/p/10544889.html