参考:
http://www.importnew.com/18961.html
http://www.cnblogs.com/dolphin0520
http://www.cnblogs.com/sunada2005/p/3577799.html
内存分区示意图:
一、运行时内存分区
1.程序计数器
记录下一条指令地址。
2.本地方法栈
为执行本地方法(Navtive方法)服务
3.Java栈(虚拟机栈)
为执行方法服务,存放栈帧。执行一个方法时,即创建栈帧,执行完毕后栈帧退出栈。
图:
1)局部变量表:存放方法中的局部变量。注,基本类型直接存值,引用类型存对象的引用
2)操作数栈:计算用的操作数
3)指向运行时常量池的引用:类中的常量
4)方法返回地址:一个方法执行完毕时,返回之前调用它的地方。
4.堆
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代(方法区):
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。
