Java内存区域与内存溢出异常
2021-03-25 15:25
标签:过程 计数 本地 共享 区域 ESS 虚拟 调用 对象引用 1)程序计数器 2)Java虚拟机栈 1)对象的创建 2)对象的内存布局 3)对象的访问定位 1)Java堆溢出 2)虚拟机栈与本地方法栈溢出 3)方法区和运行时常量池溢出 4)本机直接内存溢出 Java内存区域与内存溢出异常 标签:过程 计数 本地 共享 区域 ESS 虚拟 调用 对象引用 原文地址:https://www.cnblogs.com/heibaimao123/p/13773108.html运行时数据区域
每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表存放了编译器可知的各种基本数据类型、对象引用和returnAddress类型。
其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译器间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。
3)本地方法栈
作用与Java虚拟机栈类似,不过一个存放Java方法,一个存放本地方法。在HotSpot中直接将这两个合二为一。
4)Java堆
对大多数应用来说,堆是内存占用最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
5)方法区
与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
6)运行时常量池
是方法区的一部分。class文件中的常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池。
7)直接内存
并不是虚拟机运行时数据区的一部分。但与NIO技术有关,可以在特定场景中提高性能。HotSpot虚拟机对象
内存溢出