其他分享
首页 > 其他分享> > 垃圾回收机制Garbage Collection

垃圾回收机制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的各域分配策略动态变化   开发中容易造成内存泄漏的操作                  

标签:Garbage,对象,Collection,GC,引用,空间,回收,节点,垃圾
来源: https://www.cnblogs.com/Kundalini/p/11707800.html