java垃圾回收策略_深入理解java虚拟机之——JVM垃圾回收策略

如何判断一个对象是否存活

引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1;当引用

失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用。

Java虚拟机里面没有选用引用计数算法来管理内存,其中主要原因是他很难解决对象

之间相互引用的问题。

例如:对象objA和objB都有字段instance字段,切互相赋值,但实际上这两个对象已经不可

能被访问了,但因为他们互相引用着对方,导致他们的引用计数都不为0,于是导致他们无法回收。

(Java中这种情况是可以回收的)

public classReferenceGC {public Object instance = null;public static voidtestGC(){

ReferenceGC objA= newReferenceGC();

ReferenceGC objB= newReferenceGC();

objA.instance=objB;

objB.instance=objA;

objA= null;

objB= null;

}

}

可达性分析算法:通过一系列的称为"GC Root"的对象作为起点,从这些节点开始向下搜索,

搜素所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何的引用链

相连,就判定对象可以被回收。Java, C#等语言都是使用这种算法判读对象的存活的。

GC Root的对象包括下面几种:

虚拟机栈(栈帧中的本地变量表)中引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中JNI(Native方法)引用的变量

引用

Java1.2后对引用进行扩充,分为:

强引用:类似 Object obj = new Object()这类引用,垃圾收集器永远不会进行回收

软引用:用来描述一些还有用但非必须的对象。系统在内存溢出异常之前,将会把这些

对象列入回收范围之中进行。二次回收。如果这次回收还没有足够的内存,才会抛出内存异常。

SoftReference类实现。

弱引用:比软引用更弱一些,也是用来描述非必须对象。回收发生在下次垃圾收集器回收时。

WeakReference类实现。

虚引用:最弱一种引用,虚引用无法影响对象其生存时间,也无法通过虚引用获得

对象,唯一目的就是对象被垃圾收集器回收时,收到一个系统通知。PhantomReference类实现。

对象生存还是死亡

如果对象在进行可达性分析后发现没有与GC Roots相连的引用链,那么它将会被第一次标记并且进行

一次筛选,筛选条件是该对象是否覆盖finalize()方法,是否执行过finalize()方法。如果为覆盖或执行过则

对象死亡。

如果覆盖finalize()且有必要执行finalize(),则对象放入F-Queue的队列中,之后由虚拟机自动建立,

低优先级的Finalizer线程去执行。这里的执行是指虚拟机会触发这个方法,但不承诺会等待它运行结束。

(该方法不建议使用)

方法区回收

方法区主要回收:废弃常量和无用的类

废弃常量:例如一个字符串"abc"已经进入常量池中,但是当前系统没有其他地方引用这个字面量。

无用的类:

该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例

加载该类的ClassLoader已经被回收

该类对应的Java.lang.Class对象没有在任何地方被引用,无法再任何地方通过反射访问该类的

方法。

垃圾收集算法

标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象,标记过

程在上面提过。

不足:1.效率问题,标记和清除两个过程效率不高

2.空间问题,标记清楚产生大量内存碎片

复制算法:将内存安装容量分为大小相等的两块,每次使用其中一块。当回收时,将存活的对象复制到

为使用的内存中,清楚已使用过的内存。

不足:内存缩小到运来的一半

Java在新生代中采用这种算法,不过是将内存分为Eden和两块Survivor,每次使用Eden和其中的Suvivor

当回收时,将Eden和Suvivor存活的内存复制到未使用的Suvivor空间。HotSpot默认Eden与Suvivor比例为

8:1,相当于可以使用90%的内存,如果存活的内存超过Suvivor空间,就是用老年代进行分配担保。

标记-整理算法:过程与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活

的对象向一端移动,然后清理掉端边界以外的内存。

分代收集算法:将内存划分成几块,各个区域采用最适当的收集算法。Java一般把Java堆分为新生代和老年代,

按各个年代特点采用适当的算法。

垃圾收集器:

新生代:Serial收集器,ParNew收集器,Parallel Scavenge收集器

老年代:CMS, Seral Old(MSC), Parallel Old收集器

(GI收集器具体不了解)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值