JVM内存分配与管理及内存溢出

主要分为运行时的数据区域和非运行时数据区域(直接内存),一般说JVM内存分配管理主要指运行时的数据区域

运行时的数据区域涉及到程序计数器、Java虚拟机栈、本地方法栈、堆、方法区(其中标记部分为单个线程隔离的数据区)

  • 程序计数器:

记录当前线程所执行的虚拟机字节码指令的地址(如果正在执行的是本地方法,则为null)

当前线程私有;

不会发生OutOfMemoryError(是内存中唯一不会发生内存溢出的部分)

  • Java虚拟机栈:

当前线程私有;

每一个Java方法执行时都会创建一个栈帧用于存储局部变量表(简单类型,如int、double等;对象类型对象类型在栈中保存地址,在堆中保存值;所需的内存空间在编译期间完成分配,在方法在运行之前,该局部变量表所需要的内存空间是固定的,运行期间也不会改变)、操作数栈、动态链接、方法出口等信息(即每个方法从调用直至执行完成的过程就对应着一个栈帧在JVM栈中入栈和出栈的过程);

内存溢出:*Error异常(当线程请求的栈深度大于虚拟机所允许的深度时,触发该异常)、OutOfMemoryError异常(当栈的扩展时内存剩余空间无法满足申请数值时,触发该异常)

  • 本地方法栈:

与虚拟机栈类型,但主要为本地(Native)方法服务(本地方法不是由java语言编写的,编译成和处理器相关的机器代码,保存在动态链接库中,即.dll文件中,格式是各个平台专有的),在HotSpot虚拟机中直接将本地方法栈与虚拟机栈合并在一起。

  • 堆:

被所有线程共享,在虚拟机启动时被创建;

所有对象实例分配内存的地方(即存放所有New出来的对象);不需要连续的内存空间,可动态扩展内存;是垃圾回收(GC)的主要区域;细分为新生代和年老代;

配置文件相关参数:-Xms (初始化堆内存大小)、-Xmx(堆内存最大值)、-Xmn(新生代内存大小)

内存溢出:OutOfMemoryError异常(当堆中所剩内存空间无法完成实例分配,且堆的大小也没有办法进行扩展时,触发该异常)

  • 方法区:

线程共享

存放已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;不需要连续空间

内存溢出:OutOfMemoryError异常(当方法区内存无法满足内存的分配需求时,触发该异常)

  • 运行时常量池RCP(方法区的一部分):

用于存放编译器生成的各种字面量和符号引用;

OutOfMemoryError异常(当常量池无法再申请到内存时,触发该异常)

JVM内存分配与管理及内存溢出

引用自https://blog.csdn.net/aijiudu/article/details/72991993

直接内存

大小受本机服务器内存的限制(与Java堆大小无关)

OutOfMemoryError异常(当系统内存不足时,触发该异常)