JVM运行时数据区

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

Java虚拟机运行时数据区

程序计数器

线程私有

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

内存空间小

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

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

没有OutOfMemoryError状况

惟一在虚拟机规范中没有规定任何OutOfMemoryError状况的区域。内存

虚拟机栈

线程私有

栈帧结构

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

StackOverflowError异常

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

OutOfMemoryError异常

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

堆是Java人员常常说起的一块内存区域,也是关注最多的一块区域。堆具备一下特色:it

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

从内存回收的角度来看,Java对能够分为新生代和老年代。编译

Java堆

方法区

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

相关文章
相关标签/搜索