1 运行时数据区域

1.1 程序计数器

  • 用于寻找下一条需要执行的字节码指令
  • 线程隔离的数据区,保存每个线程自己的信息,用于现场恢复
  • 执行Naive方法,计数器值为空

1.2 Java虚拟机栈

  • 线程私有:和线程生命周期相同
  • 为java方法提供字节码服务
  • 是Java方法执行的内存模型:在执行方法时创建一个栈帧,存放局部变量表、操作数栈、动态链接方法出口等信息。
  • 一般口中说的栈指的是Java虚拟机栈中的局部变量表:局部变量表主要包括基本数据类型以及对象引用(引用指针)
  • StackOverflowError:线程请求栈深度大于虚拟机允许深度时抛出
  • OutofMemoryError:虚拟机栈动态扩展无法申请足够内存时抛出

1.3 本地方法栈

  • 和虚拟机栈性质相同,只不过不是专门处理java的字节码,而是其他语言写的Naive方法
  • 类似虚拟机栈的2个异常也会抛出

1.4 堆

  • 线程共享
  • 对象实例和数组分配的地方(不考虑栈上分配、标量替换等优化技术)
  • 堆内存不够会抛出OutofMemoryError
  • 物理上可以不连续,逻辑上连续的内存空间
  • Xmx和Xms可以控制

    1.5 方法区

  • 线程共享

  • 存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。区分下堆。

  • 无法满足内存分配需求会抛出OutofMemoryError

  • 运行时常量池是方法区重要的部分