垃圾回收机制

1.当我第一次学习java时,常把GC当做java的一个附属物,但实际上GC的历史比java久远很多。

我们从三个角度来理解gc。
 1jvm怎么确定哪些对象应该进行回收
 2jvm会在什么时候进行垃圾回收的动作
 3jvm到底是怎么清楚垃圾对象的

1.jvm怎么确定哪些对象应该进行回收?

引用计数法:
简单的来说就是判断对象的引用数量。实现方式:给对象共添加一个引用计数器,每当有引用对他进行引用时,计数器的值就加1,当引用失效,也就是不在执行此对象是,他的计数器的值就减1,若某一个对象的计数器的值为0,那么表示这个对象没有人对他进行引用,也就是意味着是一个失效的垃圾对象,就会被gc进行回收。
但是这种简单的算法在当前的jvm中并没有采用,原因是他并不能解决对象之间循环引用的问题。

可达性分析算法:
因为引用计数法的缺点有引入了可达性分析算法,通过判断对象的引用链是否可达来决定对象是否可以被回收,可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,无用的节点将会被判定为是可回收的对象

二.在确定了哪些对象可以被回收之后,jvm会在什么时候进行回收?

1。会在cpu空闲的时候自动进行回收
2。在堆内存存储满了之后
3。主动调用System.gc()后尝试进行回收

三.如何回收?

算法又有四个:标记-清除算法,复制算法,标记-整理算法,分代收集算法.

标记-清除算法

这是最基础的一种算法,分为两个步骤,第一个步骤就是标记,也就是标记处所有存活的对象,标记完成后就进行统一的回收掉没有标记的对象。这种算法优点是简单,缺点是效率问题,还有一个最大的缺点是空间问题,标记清除之后会产生大量不连续的内存碎片,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而造成内存空间浪费。

复制算法

复制将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只是这种算法的代价是将内存缩小为原来的一半

标记-整理算法

标记整理算法与标记清除算法很相似,但最显著的区别是:标记清除算法仅对不存活的对象进行处理,剩余存活对象不做任何处理,造成内存碎片;而标记整理算法不仅对不存活对象进行处理清除,还对剩余的存活对象进行整理,重新整理,因此其不会产生内存碎片。

分代收集算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法,1.7之前jvm把内存分为三个区域:新生代,老年代,永久代
在新生代中,尽可能快速收集掉生命周期短的对象,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法。只需要付出少量存活对象的复制成本就可以完成收集。
老年代:存放生命周期较长的对象,因为对象存活率高、没有额外空间对他进行分配担保,就必须用标记-清除或者标记-整理。
永久代:主要存放静态文件,比如java类,方法等。他主要回收废弃常量和无用的类,对于废弃常量也可通过引用的可达性来判断,但是对于无用的类则需要同时满足下面3个条件:
该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;
加载该类的ClassLoader已经被回收;
该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

什么时候触发GC?

GC有两种类型:Scavenge ”[ˈskævɪndʒ]“ GC和Full GC。
何时触发ScavengeGC呢?
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代
何时触发Full GC?
a) 年老代(Tenured)被写满;

b) 持久代(Perm)被写满;

c) System.gc()被显示调用;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值