【深入理解Java虚拟机】Java虚拟机运行时数据区


Java虚拟机运行时数据区

线程私有

程序计数器

  • 1、当前线程所执行的字节码的行号指示器。
  • 2、唯一不会发生OutOfMemoryError的区域
  • 3、如果执行的是java方法,计数器值为虚拟机字节码指令地址;如果执行native方法,值为空。
  • 4、java多线程中一个时刻,一个处理器都只会执行一条线程中的指令,在线程轮流切换的过程中,每个线程都有自己的程序计数器,互不影响,以便线程切换恢复到正确的执行位置。

Java虚拟机栈

  • 1、生命周期同线程相同

  • 2、描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。

  • 3、局部变量表存放编译期可知的基本数据类型(boolean、int、byte、short、double、long、float、char),对象引用(指向对象起始地址的指针或者是代表对象的句柄),returnAdress(指向字节码指令地址)

  • 4、两种异常

    • 1、StackOverflowError(线程请求的栈深度大于虚拟机允许的深度)
    • 2、OutOfMemoryError(虚拟机栈动态扩展时无法申请到足够的内存)

本地方法栈

  • 和虚拟机栈相似,区别为虚拟机栈为虚拟机执行Java代码服务,本地方法栈为虚拟机使用Native方法服务。

线程共享

Java堆

  • 1、虚拟机管理最大的一块内存
  • 2、虚拟机启动时创建
  • 3、唯一目的:存放对象实例,几乎所有对象实例和数组都在这里分配
  • 4、垃圾收集器管理主要区域(GC堆)
  • 5、可以细分为新生代、老生代
  • 6、可以通过-Xmx 和 -Xms 控制
  • 7、堆中没有内存完成实例分配,且堆也无法再扩展时,就会OutOfMemoryError

方法区

  • 1、目的:存放已被虚拟机加载的类信息、常量、静态变量等
  • 2、永久代
  • 3、HotSpot虚拟机才有的划分,方便垃圾收集器管理这部分内存
  • 4、这个区域还包含运行时常量池存放字面量,符号应用
  • 5、无法再申请内存时,就会OutOfMemoryError

XMind - Trial Version