第一个作用:给对象分配内存 第二个作用:回收分配给对象的内存
主要是在java堆上分配
java堆主要分为两个部分:新生代和老年代,新生代又分为Eden区,From Survivor区,To Survivor区 分配的原则是: 1.对象优先在Eden分配(当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC); 2.大对象(需要大量连续内存空间的java对象,虚拟机有一个参数-XX:PretenureSizeThreshold,超过这个尺寸就是大对象)直接进入老年代; 目的:因为大对象需要较大的连续内存,避免Eden和两个Survivor区发生大量的内存复制 3.长期存活的对象将进入老年代(一般指超过-XX:MaxTenuringThreshold这个值就进入老年代),虚拟机为每一个对象定义了一个年龄计数器,如果对象经过了一次Minor GC,那么对象就会进入Survivor区,之后每经过一次Minor GC,对象的年龄就加1,直到达到阈值; 4.动态对象年龄判断:并不是必须要求对象的年龄超过MaxTenuringThreshold才能进入老年代; 如果在Survivor空间中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年代。 5.空间分配担保
发生Mnior GC之前,虚拟机首先检查老年代最大的可用连续空间是否大于新生代所有对象总空间,如果是,Minor GC是安全的的; 如果不是,虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,如果允许,检查老年代最大的可用连续空间是否大于历次晋升到老年代对象的平均大小,如果是,就执行Minor GC(也是有风险的);如果不是,进行Full GC.
minor GC:新生代的垃圾回收动作(运用复制算法);发生的很频繁;执行时间比较快; Full GC:老年代的垃圾回收动作(标记清除算法或者标记整理算法):速度比较慢;
Minor GC:新对象生成,但是在Eden空间申请失败时,会触发Minor GC,对Eden区和Survivor区进行GC,清除掉非存活的对象,并且把存活的的对象移动到Survivor的一个区中; 只会在年轻代中进行。 Full GC:对整个堆进行清理(年轻代和老年代)。
如果Eden空间占满了,会触发Minor GC; 仍然存活的对象将被复制到Survivor1中去,Eden空间是清空的,可以分配给新的对象; 又触发了一次Minor GC,survivor1和Eden中存活的对象呗复制到Surviovr2中,并且survivor1和Eden被清空; 在同一时刻,只有Eden和一个survivor被操作。
如果一个对象不能在Eden被创建,他会直接创建在老年代中; 如果老年代的空间被沾满会触发老年代的 Full GC