Java虚拟机执行Java程序时,会把虚拟机管理的内存划分红不一样的区域,用于处理程序运行过程当中不一样的数据。spa
对于一个处理器,只会执行一个线程的指令。线程并非一直独享CPU的,多个线程经过切换的方式,实现一段时间内的同时执行。所以,为了线程切换后能恢复到切换前的执行位置,每一个线程都须要有个独立的空间来记录执行位置,即程序计数器。各个线程之间的程序计数器互不影响,独立存储。线程
程序计数器中存储的为当前线程执行的指令:blog
惟一在虚拟机规范中没有规定任何OutOfMemoryError状况的区域。内存
每一个方法在执行时都会建立一个栈帧。栈帧存储了局部变量表、操做数栈、动态连接、方法出口等信息。方法从调用到执行完成对应了栈帧在虚拟机栈的入栈到出站过程。rem
栈是有深度(大小)的,当线程请求的栈深度大于了虚拟机容许的深度,则throw StackOverflowError。编译器
若是虚拟机栈可动态扩展,当没法申请到足够的内存,则throw OutOfMemoryError。虚拟机
堆是Java人员常常说起的一块内存区域,也是关注最多的一块区域。堆具备一下特色:it
从内存回收的角度来看,Java对能够分为新生代和老年代。编译
方法区是全部线程共享的内存区域,用来存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区没法知足内存分配需求时,也会抛出OutOfMemoryError异常。class