一、Java内存结构图
二、结构图的各个结构介绍
-
程序计数器
:保存当前线程执行的指令的地址 -
虚拟机栈
:存放一个个栈帧,而一个栈帧对应着一个Java方法
栈帧:一种数据结构,包括局部变量表、操作数据栈、指向运行时常量池的引用(动态链接)、方法返回地址和额外的附加信息;一个方法对应一个栈帧,方法开始时创建压入栈帧,结束时弹出栈帧 -
本地方法栈
:跟虚拟机栈一样,但是对应的不是Java方法,而是本地Native方法,两个栈都会出现StackOverflowError异常和OutOfMemoryError异常 -
堆
:存储真正对象和数组的一种数据结构;
注意存数组的,而数组的引用在虚拟机栈中
集合所有对象实例都在该区域进行内存分配
注意1.7之后字符串常量池存放在堆中,字符串常量池中存储编译期间生成的字面量和符号引用 -
方法区
:存储每个类的信息、静态变量、常量和编译后的代码
注意之前的字符串常量池放在方法区中的
方法区中还有一个非常重要的部分是运行时常量池,它是每个类或接口运行时的表示形式,在类或接口被加载到JVM后,对应的运行时常量池就被创建出来,每个类或接口有一个运行时常量池
除了class文件常量池中的内容能进入运行时常量池,在运行期间也可以将新的常量放入运行时常量池 -
本地内存中的元数据区(元空间)
:元数据区跟方法区的功能一样,由于方法区容易出现性能问题和内存溢出,就在本地内存中使用元数据区替代它
谢谢阅读,如有不对之处请指出!