Java运行时内存模式学习

运行时内存模式:

img

 

各区介绍:

  方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoader被回收)。

  Java堆(线程共享):存放对象实例和数组,这里是内存回收的主要地方。可以分为新生代(young)和年老代(tenured)。从字面也可以知道,新生代存放刚刚建立的对象,而年老代存放长久没有被垃圾回收机制回收的对象。一般新生代有分为eden,from survivor和to survivor。这是和回收算法相关的分配(通过-Xms和-Xmx来配置)。

  程序计数器(线程私有):Java被编译成class,并被JVM解释执行,执行的是每一条指令。程序计数器记录当前线程执行的字节码地址,使得程序在轮询获取CPU时间片执行的时候能够知道从何处执行。因此很好想到,这篇区域是线程私有的,因为这里记录的就是不同线程的执行地址。(程序计数器一般都比较小,所以在内存资源的分析时都会忽略这片内存的占用)。

  虚拟机栈(线程私有):随线程一起建立,这是方法执行的内存模型,用来管理方法的执行。当方法开始执行时,记录方法的局部变量表,操作数栈,动态链接方法,返回值,返回值的地址等方法执行的信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出StackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。

  本地方法栈(线程私有): 本地方法栈和虚拟机栈类似,只是这是存储本地方法的内存模型,管理本地方法的执行(Native)

  

  

 

posted @ 2016-04-11 22:10  MageByte  阅读(595)  评论(0编辑  收藏  举报