JVM内存结构

一、 运行时数据区
jvm运行java程序时,会将内存划分为多个数据区域。

分析JVM数据结构,主要分析的是运行时数据存储区域,主要包括:堆、栈、方法区、程序计数器等。而JVM得优化问题主要集中在线程共享的数据区中:堆,方法区

image.png

二、 程序计数器
是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读取下一条指令。
更确切地说,一个指令的执行,是通过字节码解释器改变当前现成的计数器的值,来获取下一条需要执行的字节码指令,从而确保线程的正确执行。

为了确保线程切换(上下文切换,互斥锁会涉及)之后,能恢复到正确的1执行位置,每个线程都有一个独立的线程计数器,各个线程的计数器互不影响,独立存储。也就是程序技术器是线程私有的。

如果线程执行的java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,计数器值为Undefined。

程序计数器不会发生内存溢出问题(OutOfMemory)。

三、 栈
包括Java虚拟机栈和本地方法栈
区别
Java虚拟机栈为JVM执行java方法服务;本地方法栈则为JVM使用的搞得Native方法服务。

Native方法:不是以Java语言实现的,而是以本地语言实现的(c/c++)。比如System.gc()

栈中存储的是什么?
栈帧是栈的元素。每个方法运行时都会创建一个栈帧,栈帧存储了局部变量表、操作数栈、动态连接和方法出口等信息。每个方法从调用到运行结束的过程对应着一个栈帧在栈中的压栈到出栈的过程。

局部变量表
局部变量表中存储了基本数据类型(boolean、byte、char、short、int、float、double)的局部变量和对象的引用(String、数组、对象等),不存储对象内容。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小

局部变量的容量以容量槽(variable slot)为最小单位,每个变量槽最大存储32位的数据类型(int),对于64位的数据类型(long、double),jvm会为其分配两个连续的变量槽来存储。

你可能感兴趣的:(JVM内存结构)