0
点赞
收藏
分享

微信扫一扫

描述运行时数据区各区域的用途以及什么情况下会抛出异常

時小白 2022-01-25 阅读 36
  • 程序计数器

是线程私有的内存,可以看作是当前线程所执行的字节码的行号指示器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;如果是Native方法,这个计数器值则为空。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

  • Java虚拟机栈

线程私有的内存。虚拟机栈描述的是Java方法执行的内存模式,每个方法在执行的同时都会创建一个栈帧,方法从调用直至执行完毕的过程,对应着一个栈桢在虚拟机栈中入栈到出栈的过程。

  • 本地方法栈

与虚拟机栈作用相似,区别在于虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机执行Native方法服务。虚拟机栈和本地方法栈规定了两种异常情况:

  1. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError
  2. 如果虚拟机栈可以动态扩展,且扩展时无法申请到足够的内存,会抛出OutOfMemoryError。

堆内存是线程共享的区域,也是垃圾回收的主要场所。在虚拟机启动时创建,用于存放对象的实例。通过-Xmx-Xms可以控制大小。当堆中没有内存完成实例分配,并且堆也无法再扩展时,会抛出OutOfMemoryError。

  • 方法区

线程共享的区域。用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据,也可以称为“永久代”,通过-XX:MaxPermSize控制上限。当方法区无法满足内存分配要求时,会抛出OutOfMemoryError。

举报

相关推荐

0 条评论