Java垃圾回收(Garbage Collection:GC)

Java垃圾回收(Garbage Collection:GC)

一.好处和缺陷

1.好处:

1).垃圾回收器能够精确标记活着的对象。

**垃圾(无用的对象,死去的对象):**当没有对象引用指向原先分配给某个对象的内存时,该内存便成了垃圾。

2).垃圾回收器能够精确定位对象之间引用关系,所有对象均能重新分配,防止内存支离破碎。

**碎片:**由于创建对象和垃圾回收期释放丢弃对象所占的内存空间,导致的内存块之间的空隙。

3).有效的防止内存的泄露。

**内存泄露:**无用信息对象不能被回收,导致无用信息对象所占内存空间越来越多,可用空间越来越少,造成内存泄露。

2.缺陷:

1).垃圾回收发生的时间,不可确定。
system.gc()

同样是不确定方法,调用此方法,只能向JVM发出一个申请,是否真正指向垃圾回收机器,是否一定能启动垃圾回收器,均是未知的。

2).影响程序性能。

JVM必须跟踪允许程序中有用的对象。

二.算法特点##

一.特点:

1).发现无用的对象

2).回收被无用对象占用的内存

二.分类:

1.引用计数法

1).实现
堆内存中每一个对象对应一个计数器。当创建一个对象时且赋值时,计数器置位1;当该对象丢弃不再使用时,计数器-1,置为0。为0满足垃圾回收条件。

2).优点

不会长时间中断程序执行,适合实时运行的程序。

3).缺点

计数器+、-增加了程序执行开销。

2.标记-清除算法

1).实现
使用根集{正在执行的java程序可以访问的引用变量的集合(局部变量、类变量、参数),程序可以使用引用变量访问对象的属性和调用方法。确定从根开始哪些是可达,哪些不可达。从根集通过任意路径不可达对象会被作为垃圾回收},从根集开始扫描,识别可达和不可达对象。
在这里插入图片描述
2).优点

停顿少

3).缺点

易产生垃圾碎片!!!

3.标记-整理算法

1).实现

在清除死对象(无用对象)的过程中,将剩下还活着的对象移动到堆的一端。收集器会对它移动的所有的活对象的对用引用进行更新,使得这些引用在新的位置能识别原来的对象。
在这里插入图片描述
2).优点

解决了标记-清除的碎片问题

3).缺点

增加了对象和内存之间的引用,句柄。

4.Coping算法

1).实现

将内存分为两半,一半先存对象,当对象占满了这一块内存,则将这半内中存活着的对象复制到另一半内存。往返执行此操作。
在这里插入图片描述
2).优点

防止内存碎片

3).缺点

内存缩小为一半。且copying会有暂定。
5.generation算法

1).实现

多数对象存的时间比较短;少数对象存的时间长。
将内存分为年轻代(生命周期短)Minor GC经常回收、老年代(生命周期长),Major GC不常回收。

一开始:

除了大对象等直接进入老年代,大部分新进入新生代的Eden区和From survivor区。

接着:

Minor GC将Eden区和From区无用对象回收,将活着的对象,复制到To survivor区。之后,将Eden区和From区清空,此时To区和From区功能互换。
在这里插入图片描述
然后:

再将对象存到清空了的Eden区,和To区。往返执行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值