本文介绍Java虚拟机的内存结构;
线程私有的内存区:
程序计数器: 当前线程所执行的字节码的行号指示器
Java虚拟机栈:Java方法执行的内存模型 ,每个方法被执行时都会创建一个栈帧 ,存储局部变量表、操作栈、动态链接、方法出口等信息。
通过-Xss设置
该区域规定了两种异常:如果线程请求的栈深度超过虚拟机允许的深度,将抛出StackOverflowOver异常;虚拟机栈自动扩展无法申请足够的内存时,会抛出OutOfMemoryError异常
本地方法栈:Natvie方法服务。在HotSpot里本地方法栈和虚拟机栈合二为一
线程共享的内存区:
Java堆:存放对象实例,几乎所有的对象实例都在这里分配内存。
如果可扩展(-Xms -Xmm),堆内存已经用完并且无法再申请扩展时,抛出OutOfMemoryError异常;
方法区:存储已被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据;运行时常量池:方法区的一部分。用于存放编译期生成的各种字面量和符号引用。
通过-XX:PermSize和-XX:MaxPermSize设置
如果无法满足内存分配需求时,抛出OutOfMemoryError异常;
直接内存:NIO,Native函数为直接分配堆外内存。DirectByteBuffer引用操作;这部分不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域;
可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xmx)一致