java虚拟机运行时数据区

java虚拟机在运行的时候会把内存分为不一样的区域,每一个区域都有其特定额用途。java虚拟机运行数据区如图所示。java

 

一、程序计数器   数组

  是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。若是线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;若是是Naive方法,则计数器为空;这个区域不会出现OUtOfMemoryError异常。多线程

     java虚拟机多线程是使用线程轮流切换并分配处理执行时间的方式来实现的,在任何一个肯定的时刻,一个处理器都只会执行一条线程中的指令。为了线程切换后可以恢复到正确的执行位置,每条线程都须要一套独立的线程计数器,这些计数器之间相互独立,独立存储,这个内存区域为“线程私有”。spa

 二、java虚拟机栈线程

 java虚拟机栈也是线程私有,与线程的生命周期一致,在执行每一个方法都会建立一个Stack Frame。每个方法从开始执行到结束,对应一个Stack Frame在虚拟机值栈中从入栈和出栈的过程。若是线程请求的栈深度大于虚拟机所容许的深度,就会出现StackOverFlowException。若是容许动态扩展,在扩展的过程当中,若是没法申请到足够的内存,则会抛出OutOfMemoryException异常。对象

三、本地方法栈blog

和java虚拟机栈的做用相似,不一样点在本地方法栈主要是为虚拟机使用到的Native方法提供服务,本地方法栈也会抛出StackOverFlowExceptionOutOfMemoryException异常。生命周期

四、java堆内存

堆是java虚拟机中内存中最大的一块,被全部线程共享的一块内存区域,在虚拟机建立时建立。做用就是存放对象实例,全部的对象的实例都须要在这里分配内存。几乎全部的对象实例和对象数组都须要在堆上分配。是java虚拟机内存回收的管理的重要区域,所以也被称为“GC”堆,能够被分为:新生代和老年代Eden空间、From Survivor空间、To Survivor空间。若是堆中没有内存完成实例分配,而且堆也没法扩展时,则抛出OutOfMemoryException异常开发

五、方法区

方法区和java堆同样,是各个线程共享的内存区域,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码等数据。一般被开发人员成为“永久带”。这个区域的内存回收的目标就是针对常亮池的回收和对类型的卸载,也是较为难处理的部分。

相关文章
相关标签/搜索