java中不同对象的生命周期是不一样的,不同周期对象课采用不同垃圾回收算法,以提高效率,根据对象活跃程度分为年轻代、年老代、持久代。JVM堆区划分为Eden、Survivor、Tenured/Old区。
年轻代
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分为Eden区和两个Survivor(一般为两个,也可多个)。
年老代
在年轻代中经历N次垃圾回收后,仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代
存放静态文件,如java类、方法等,对垃圾回收没有显著影响
GC: Garbage Collection 垃圾回收
Minor GC
用于清理年轻代,Eden满了,就触发Minor GC ,清理无用对象,把有用对象放到Survivor1或Survivor2中。
Major GC
用于清理老年代。
Full GC
清理年轻代、老年代区域,成本高,对系统性能产生影响
清理过程
1. 创建新对象,大多数放在Eden区
2. Eden满了(或达到一定比例),触发Minor GC, 把有用的复制到Survivor1, 同时清空Eden区。
3. Eden区再次满了,出发Minor GC, 把Eden和Survivor1中有用的,复制到Survivor2, 同时清空Eden,Survivor1。
4. Eden区第三次满了,出发Minor GC, 把Eden和Survivor2中有用的,复制到Survivor1, 同时清空Eden,Survivor2。
形成循环,Survoivor1和Survivor中来回清空、复制,过程中有一个Survivor处于空的状态用于下次复制的。
5. 重复多次(默认15),没有被Survivor清理的对象,复制到Old(Tenuerd)区.
6. 当Old达到一定比例,触发Major GC,清理老年代。
7. 当Old满了,触发Full GC。注意,Full GC清理代价大,系统资源消耗高。
注:
1. 程序员可以像JVM提出垃圾回收请求,但是实际是否回收由JVM决定,程序员只提出清理请求建议,不能直接清理。
2. Full GC清理代价大,系统资源消耗高,很多性能优化是针对Full GC做优化。