Java深度学习系列——垃圾回收算法及四大引用

常见的几种垃圾回收算法

引用计数法

这是最简单的垃圾回收算法,在最初的一些高级语言中用到了引用计数法 ,网上说Python现在用的是这种垃圾回收算法。现在的Java语言不用这种回收算法。

Person p1=new Person();
Person p2=p1;

以上代码中new Person()产生了对象空间,由p1指向此对象空间,此时此空间会被记录为:1,之后p2也指向了此空间,此时此空间会被记录为:2,引用计数法会判断当此空间的记录为:0 时,将此空间视为垃圾。

问:Java中为什么不用引用计数法回收垃圾呢?

原因是:循环引用 ,可以理解为:你中有我我中有你,比如A对象有属性B,B对象有属性A,因而造成了其引用计数一直为:1,因而无法被回收。

根搜索算法

我们创建的某个对象很多时候此对象空间存在多个属性,所以此对象可能间接创建了多个对象,那么我们叫此对象是另外多个对象的: ,此时会根据为起点来判断多个对象中那些是需要回收的。

标记清除法

是根据根搜索算法延伸出来的算法,它清除垃圾空间时分为两步:

  1. 全部扫描标记一遍(只要判断是垃圾就会被标记)

  2. 将所以被标记的垃圾清除

此回收算法的缺点:

可能会产生大量的内存碎片,断断续续的。断开的空间不容易存放数组(必须是一串连续的空间),而且每次创建新对象时会扫描来填补内存碎片,扫描也是需要时间的。存在性能问题和大量内存碎片问题。

复制算法

是根据根搜索算法延伸出来的算法,首先会将内存空间分成大小相等的两份(方便理解我们用原内存和镜像内存表示),一开始我产生的所有空间的值都在原内存中。当我回收时会判断此对象空间是否为垃圾,如果不是,则会把它复制到镜像内存中去。最后将原内存空间清空。

复制算法的优点

不会产生内存碎片,很多智能硬件 采用了智能算法,它们在系统升级时依然可以使用。因为是可以使用镜像内存空间。

复制算法的缺点

很明显复制算法需要将内存分为两块。相当于砍掉了一半的内存空间。

标记整理法

是根据根搜索算法延伸出来的算法,首先将所以需要清除的垃圾空间标记,之后把不需要清除的空间前移,覆盖需要清除的垃圾空间。

标记整理算法的优点

不会产生内存碎片,也不会将内存空间砍掉一半。

标记整理算法的缺点

很明显这是一种以时间换空间的做法,占用的CPU资源多,性能太差了。

分代收集法

Java目前采用的正式分代收集法,在JDK1.8之前将内存区域分为三个部分:年轻代、老年代、永久代,它们在内存中的区域比例原配是:8:1:1,我们经常是自己去调节比例。

GC:垃圾回收器,它是个守护级别的小线程

年轻代的GC是YoungGC,它在扫描多次后发现有些内存空间仍然不是垃圾,此时就没有必要扫描了,此时就会将此空间存入老年代中去,以后在扫描时无需在扫描此空间,此外,如果对象是大对象(占用内存空间较大的对象),则会直接存入老年代中去。

老年代的GC是FullGC,当老年代空间快满的时候会触发FullGC,此时会:Stop the World Java的世界都停止了。会调用所有性能来完成FullGC的扫描,为了防止FullGC的触发,我们通常会调整占用比例。

在JDK1.8之后,永久代和方法区统称为:元空间。此时堆内存的空间就只有两部分:年轻代、老年代。

如果频繁的触发FullGC,建议将年轻代和老年代的占用比例调成:2:8,甚至1:9,这个在于当前的需求了。所以我们在网上会看到很多关于:JVM性能调优的话题

另外分代收集法可以理解为是一个复合回收算法,因为它回收垃圾时综合了多种垃圾回收算法。

强弱软虚四大引用

强引用

我们平时创建对象的方式都是强引用,Object obj=new Object(); 这个没啥好说的。

弱引用

WeakReference obj1 = new WeakReference(obj);第二次垃圾回收的时将内存回收。不管此对象还有没有引用指向。

软引用

SoftReference obj3 = new SoftReference();当内存满了,可以自动占用(覆盖),并且进行垃圾回收。(不同的jdk版本有不同的实现方法)

虚引用

PhantomReference obj2 = new PhantomReference(obj);当内存满的时候,全部回收,或者当执行垃圾回收的时候全部回收(不同的jdk版本有不同的实现方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值