Java虚拟机运行时内存区域

Java虚拟机运行时内存区域如下图所示。
java虚拟机运行时数据区
其中程序计数器、虚拟机栈、本地方法栈是线程私有的;方法区和堆是线程间共享的。

程序计数器
当前线程所执行的字节码指示器(每个线程都有一个程序计数器)。字节码解释器工作时就是通过改变程序计数器的值来选取下一条要执行的指令。若线程正在执行的是Java方法,计数器中记录的是正在执行的虚拟机字节码指令的地址;若线程执行的是Native方法,则程计数器为空。程序计数器是运行时内存中唯一一个不会抛出OutOfMemoryError的区域。
Java虚拟机栈
虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,每一个方法执行对应着一个栈帧的入栈和出栈操作。栈帧用于存储局部变量表、操作数栈、动态连接、方法返回地址等信息。
异常:如果线程请求的栈深度大于虚拟机所允许的深度,会抛出stackOverflowError异常;如果虚拟机栈可以动态扩展,扩展时如果申请不到足够的内存,会抛出OutOfMemoryError异常。
本地方法栈
本地方法栈与虚拟机栈的作用相似,只不过是为Native方法服务。
也会抛出stackOverflowError异常和OutOfMemoryError异常
方法区
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
运行时常量池是方法区的一部分,保存Class文件中描述的符号引用和翻译出来的直接引用。运行时常量池对于Class文件的另一个重要特征是具备动态性,并非只有预置入Class文件中常量池的内容才能进入方法区的运行时常量池,运行时也可以将新的常量放入池中。
当方法区无法满足内存分配的时候,将抛出OutOfMemoryError异常。

Java虚拟机规范中描述的是:所有对象和实例以及数组都要在堆上分配。
用来存放对象实例,是java虚拟机所管理的内存中最大的一块。java堆是垃圾收集器管理的主要区域,因此有时也称为GC堆。
Java堆又可以进一步划分为新生代和老年代。其中新生代又可以进一步划分为Eden区和两个较小的Survivor区。
java堆划分
如果在堆中没有内存完成实例分配并且堆也无法再扩展的时候,会抛出OutOfMemoryError异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值