JVM垃圾回收算法及Java引用

目录

Java垃圾回收算法

1.标记清除算法:Mark-Sweep

2.复制算法:copying

3. 标记整理算法:Mark-Compact

4.分代收集算法

5.新生代垃圾回收算法:复制算法

6.老年代:标记整理算法

7.分区收集算法

Java引用

1.Java强引用

2.Java弱引用

3.Java软引用

4.Java虚引用


Java垃圾回收算法

1.标记清除算法:Mark-Sweep

1.原理:标记清楚算法分为两个阶段:

        标记:标记出所有需要回收的对象

        清楚:回收被标记的的对象所占用的空间

2.缺点:内存碎片化问题严重,大对象可能无法找到可利用空间

JVM垃圾回收算法及Java引用_第1张图片

 

2.复制算法:copying

1.原理:为解决标记清楚算法内存碎片化提出的算法。将内存按内存容量划分为等大小的两块,每次使用其中一块,当这一块内存满后将存活对象复制到另一块上,将已经使用的内存清理掉。

2.缺点:可用内存只有原来的一半;存活数量增多后,由于需要复制,算法效率降低。

JVM垃圾回收算法及Java引用_第2张图片

3. 标记整理算法:Mark-Compact

1.原理:结合标记清除算法+复制算法提出的算法。

        标记:标记出所有需要回收的对象

        整理:将存活对象移向内存的一端,之后清楚标记对象

        JVM垃圾回收算法及Java引用_第3张图片

 

4.分代收集算法

原理:根据对象存活的不同生命周期,将内存划分为不同区域。

        一般将GC堆划分为老年代和新生代,老年代中,每次垃圾回收只有少量对象需要被回收;新生代中,每次垃圾回收会被大量垃圾需要被回收。根据不同代所属区域选择不同算法

5.新生代垃圾回收算法:复制算法

        新生代中存活对象少,有大量垃圾需要被回收,因此选择复制算法,付出少量存活对象的复制成本即可完成收集

6.老年代:标记整理算法

        老年代中的对象存活率高,使用内存复制会付出大量复制成本,使用标记整理算法能够腾出空闲内存。

7.分区收集算法

原理:将整个堆空间划分为连续的不同小区间,每个区间独立使用,独立回收

优点:可以控制一次回收多少小区间,而不是直接回收整个堆。根据目标停顿时间,合理回收若干个小区间,从而减少一次GC所产生的停顿时间(用户等待时间)。

Java引用

1.Java强引用

定义:将一个对象赋给一个引用遍历,该引用变量就是一个强引用;强引用是使用最普遍的引用

缺点:一个对象被强引用变量引用时,就处于可达状态,因此不会被垃圾回收机制回收,容易造成Java内存泄漏

2.Java弱引用

定义:使用WeakReference类实现,弱引用的对象只要垃圾回收机制一运行,无论内存空间是否足够,都会回收该对象所占用的内存。

3.Java软引用

定义:使用SoftReference类实现,软引用的对象当系统内存足够时不会被回收,内存不足时再被回收

4.Java虚引用

定义:使用PhantomReference类实现,必须与引用队列联合使用,无法单独使用

作用:跟踪对象被垃圾回收的状态

你可能感兴趣的:(jvm,java,开发语言)