#1、JVM内存区域
程序计数器html
程序计数器是线程私有的区域,每一个线程固然得有个计数器记录当前执行到那个指令。占用的内存空间小,能够把它当作是当前线程所执行的字节码的行号指示器。若是线程在执行Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;若是执行的是Native方法,这个计数器的值为空(Undefined)。此内存区域是惟一一个在Java虚拟机规范中没有规定任何OutOfMemoryError状况的区域。算法
Java虚拟机栈函数
与程序计数器同样,Java虚拟机栈也是线程私有的。其生命周期与线程相同。如何理解虚拟机栈呢?本质上来说,就是个栈。里面存放的元素叫栈帧,栈帧好像很复杂的样子,其实它很简单!它里面存放的是一个函数的上下文,具体存放的是执行的函数的一些数据。执行的函数须要的数据无非就是局部变量表(保存函数内部的变量)、操做数栈(执行引擎计算时须要),方法出口等等。 执行引擎每调用一个函数时,就为这个函数建立一个栈帧,并加入虚拟机栈。换个角度理解,每一个函数从调用到执行结束,实际上是对应一个栈帧的入栈和出栈。线程
本地方法栈htm
本地方法栈与虚拟机栈所发挥的做用很类似,他们的区别在于虚拟机栈为执行Java代码方法服务,而本地方法栈是为Native方法服务。与虚拟机栈同样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。对象
Java堆blog
Java堆能够说是虚拟机中最大一块内存了。它是全部线程所共享的内存区域,几乎全部的实例对象都是在这块区域中存放。固然,随着JIT编译器的发展,全部对象在堆上分配渐渐变得不那么“绝对”了。 Java堆是垃圾收集器管理的主要区域。因为如今的收集器基本上采用的都是分代收集算法,全部Java堆能够细分为:新生代和老年代。在细致分就是把新生代分为:Eden空间、From Survivor空间、To Survivor空间。当堆没法再扩展时,会抛出OutOfMemoryError异常。生命周期
方法区图片
方法区存放的是类信息、常量、静态变量等。方法区是各个线程共享区域,很容易理解,咱们在写Java代码时,每一个线程度能够访问同一个类的静态变量对象。内存