Java虚拟机执行Java程序时,会把虚拟机管理的内存划分成不同的区域,用于处理程序运行过程中不同的数据。

Java虚拟机运行时数据区

程序计数器

线程私有

对于一个处理器,只会执行一个线程的指令。线程并不是一直独享CPU的,多个线程通过切换的方式,实现一段时间内的同时执行。因此,为了线程切换后能恢复到切换前的执行位置,每个线程都需要有个独立的空间来记录执行位置,即程序计数器。各个线程之间的程序计数器互不影响,独立存储。

内存空间小

程序计数器中存储的为当前线程执行的指令:

  • 如果当前执行的是Java方法,程序计数器记录的是正在执行的虚拟机字节码指令地址
  • 如果执行的是Native方法,程序计数器记录的值为空

没有OutOfMemoryError情况

唯一在虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈

线程私有

栈帧结构

每个方法在执行时都会创建一个栈帧。栈帧存储了局部变量表、操作数栈、动态链接、方法出口等信息。方法从调用到执行完成对应了栈帧在虚拟机栈的入栈到出站过程。

StackOverflowError异常

栈是有深度(大小)的,当线程请求的栈深度大于了虚拟机允许的深度,则throw StackOverflowError。

OutOfMemoryError异常

如果虚拟机栈可动态扩展,当无法申请到足够的内存,则throw OutOfMemoryError。

堆是Java人员经常提及的一块内存区域,也是关注最多的一块区域。堆具有一下特点:

  • 通常是虚拟机管理的最大的一块区域
  • 被所有线程共享
  • 垃圾收集器管理的主要区域
  • OutOfMemoryError异常

从内存回收的角度来看,Java对可以分为新生代和老年代。

Java堆

方法区

方法区是所有线程共享的内存区域,用来存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区无法满足内存分配需求时,也会抛出OutOfMemoryError异常。


tinyking
39 声望3 粉丝

为了你快乐,所以我微笑。