Java 内存分为以下几个区块:
堆 -- 只要对象是通过new来创建的, 该对象就会存在堆中
Eden -- 新生代
-- Survivor 幸存对象
from
to
Tenured -- 老年代
堆内存GC原理:
GC分为 minor GC和 full GC.
minor GC主要负责回收新生代对象, 它将不定时的做GC处理, 当新建一个对象时,对象会被放入Eden区,
当Eden区满时,还存活的对象将被复制到survivor from区。当该survivor from区满时,此区的存活对象被复制到另外一个survivor to区,当第2个survivor区也满时,该区还存活的对象将被复制到年老区(tenured),当Eden+survivor from区满后系统会做一次minor GC.
minor GC采用的是Copying算法, 将这两个区域存活下来的对象复制到survivor to区, 同时对象的age将设为1, 每一次的minor GC都会增加age, 当对象的age增加到某一个阀值时该对象就会进入到Tenured 区
full GC 主要是针对Tenured区的对象进行GC, 它的执行频率远低于minor GC.
栈
每个线程在执行每一个方法的时候都会申请一个栈帧, 每个栈帐都包含了局部变量区和操作数栈, 用于存放此次方法调用的临时变量,参数和中间结果
本地方法栈
用于支持 native方法的执行, 记录每一个native方法调用的状态.
方法区 --用于存放要加载的class, 静态变量, final类型的常量, 属性和方法信息.
Permanet -- 持久代