目录
运行时数据区域
图片中所示就是jvm运行时数据区域,左手边灰色框(方法区、堆)为线程间共享的,右手边白色框(虚拟机栈、本地方法栈、程序计数器)全都是每个线程独有的。下面会为大家逐一进行讲解。
1. 程序计数器
主要用于存放下一行要执行的指令的行号
举个例子:给一个绳上绑一个计数器,记录每根绳子跳的次数,绳之间互不影响,也不会造成内存溢出。每个线程上都有一个,互不影响。
2.虚拟机栈
栈通常指的就是虚拟机栈,更多情况下指的是虚拟机栈中的局部变量表
局部变量表存放了编译期可知的各种java虚拟机基本数据类型。对象引用类型,不是指对象本身,可能是指向对象起始地址的引用指针。
存储空间以局部变量槽表示,其中64位长度的long和 double类型的数据会占用两个变量槽,其余的数据类型只占用一个。
3.本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。
4.堆
主要用于存储对象的,几乎所有的对象实例都在这里分配内存
线程之间是共享的。此内存区域的唯一目的就是存放对象实例,Java 世界里“几乎”所有的对象实例都在这里分配内存。
5.方法区
线程之间是共享的。存放被虚拟机加载的类型信息、常量、静态变量、代码缓存等
想了解jvm对象内存布局,下方戳戳