Java虚拟机执行Java程序时,会把虚拟机管理的内存划分成不同的区域,用于处理程序运行过程中不同的数据。
程序计数器
线程私有
对于一个处理器,只会执行一个线程的指令。线程并不是一直独享CPU的,多个线程通过切换的方式,实现一段时间内的同时执行。因此,为了线程切换后能恢复到切换前的执行位置,每个线程都需要有个独立的空间来记录执行位置,即程序计数器。各个线程之间的程序计数器互不影响,独立存储。
内存空间小
程序计数器中存储的为当前线程执行的指令:
- 如果当前执行的是Java方法,程序计数器记录的是正在执行的虚拟机字节码指令地址
- 如果执行的是Native方法,程序计数器记录的值为空
没有OutOfMemoryError情况
唯一在虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
虚拟机栈
线程私有
每个方法在执行时都会创建一个栈帧。栈帧存储了局部变量表、操作数栈、动态链接、方法出口等信息。方法从调用到执行完成对应了栈帧在虚拟机栈的入栈到出站过程。
StackOverflowError异常
栈是有深度(大小)的,当线程请求的栈深度大于了虚拟机允许的深度,则throw StackOverflowError。
OutOfMemoryError异常
如果虚拟机栈可动态扩展,当无法申请到足够的内存,则throw OutOfMemoryError。
堆
堆是Java人员经常提及的一块内存区域,也是关注最多的一块区域。堆具有一下特点:
- 通常是虚拟机管理的最大的一块区域
- 被所有线程共享
- 垃圾收集器管理的主要区域
- OutOfMemoryError异常
从内存回收的角度来看,Java对可以分为新生代和老年代。
方法区
方法区是所有线程共享的内存区域,用来存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区无法满足内存分配需求时,也会抛出OutOfMemoryError异常。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。