Java内存区域与内存溢出异常

2021-03-25 15:25

阅读:509

标签:过程   计数   本地   共享   区域   ESS   虚拟   调用   对象引用   

运行时数据区域

1)程序计数器

  • 一块较小的内存空间,是当前线程所执行的字节码的行号指示器。
  • 线程私有
  • 线程执行Java方法,记录的是正在执行的虚拟机字节码指令的地址。执行Native方法,计数器值为空。

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

HotSpot虚拟机对象

1)对象的创建

2)对象的内存布局

3)对象的访问定位

内存溢出

1)Java堆溢出

2)虚拟机栈与本地方法栈溢出

3)方法区和运行时常量池溢出

4)本机直接内存溢出

Java内存区域与内存溢出异常

标签:过程   计数   本地   共享   区域   ESS   虚拟   调用   对象引用   

原文地址:https://www.cnblogs.com/heibaimao123/p/13773108.html


评论


亲,登录后才可以留言!