垃圾回收机制Garbage Collection

GC的作用:
1.发现无用的对象
2.回收无用对象所占的空间
 
那么GC如何发现对象是否无用呢?
一、引用计数法
每个对象都有一个引用计数,被引用一次,计数加1,被引用变量值变为null,则计数减1,直至到计数为0,则表示变成无用对象,优点是算法简单,缺点是循环引用的无用对象无法识别
二、引用可达法(根搜索法)
 程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕后,剩余的节点则被认为是没有被引用的节点,将其回收
 
通用的分代垃圾回收
分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的,因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率,我们将对象分为三种状态: 年轻代、年老代、持久代。JVM将内存划分为
Edern、Survivor、Old空间。持久代指类信息,或者说代码存在,它就存在。持久代在方法区,而年轻代在Edern空间内,年老代就在Old空间中。
 
当Edern空间满了之后,不能创建新对象,并触发垃圾回收机制中的 Minor GC,利用引用计数或引用可达清除无用对象,然后将Edern空间内的对象全copy到Survivor1、Survivor2空间中(这两个空间大小相同,同一时刻只有一个是空的,一个在用)。然后又创建新对象到Edern空间中,不断反复。到后来Survivor2满了,将其copy到 Old空间中,注意Survivor区满了不会触发GC。但当Old空间也满了,就会启动Major GC,当所有空间都满了,会启动Full GC,用于清理年轻代、年老代区域。成本较高,会对系统性能产生影响。
 
JVM调优和Full GC
在对JVM调优的过程中,很大一部分工作是对Full GC的调节(避免使用Full GC)有如下原因可能导致调用full GC:
1.年老代被写满
2.持久代被写满
3.System.gc()被显示调用( 程序建议GC启动,不是调用GC)
4.上一代GC之后Heap的各域分配策略动态变化
 
开发中容易造成内存泄漏的操作
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/Kundalini/p/11707800.html