目录
Java垃圾回收算法
1.标记清除算法:Mark-Sweep
1.原理:标记清除算法分为两个阶段:
标记:标记出所有需要回收的对象
清楚:回收被标记的的对象所占用的空间
2.缺点:内存碎片化问题严重,大对象可能无法找到可利用空间
2.复制算法:copying
1.原理:为解决标记清楚算法内存碎片化提出的算法。将内存按内存容量划分为等大小的两块,每次使用其中一块,当这一块内存满后将存活对象复制到另一块上,将已经使用的内存清理掉。
2.缺点:可用内存只有原来的一半;存活数量增多后,由于需要复制,算法效率降低。
3. 标记整理算法:Mark-Compact
1.原理:结合标记清除算法+复制算法提出的算法。
标记:标记出所有需要回收的对象
整理:将存活对象移向内存的一端,之后清楚标记对象
4.分代收集算法
原理:根据对象存活的不同生命周期,将内存划分为不同区域。
一般将GC堆划分为老年代和新生代,老年代中,每次垃圾回收只有少量对象需要被回收;新生代中,每次垃圾回收会被大量垃圾需要被回收。根据不同代所属区域选择不同算法
5.新生代垃圾回收算法:复制算法+标记清楚
新生代中存活对象少,有大量垃圾需要被回收,因此选择复制算法,付出少量存活对象的复制成本即可完成收集
6.老年代:标记整理算法
老年代中的对象存活率高,使用内存复制会付出大量复制成本,使用标记整理算法能够腾出空闲内存。
7.分区收集算法
原理:将整个堆空间划分为连续的不同小区间,每个区间独立使用,独立回收
优点:可以控制一次回收多少小区间,而不是直接回收整个堆。根据目标停顿时间,合理回收若干个小区间,从而减少一次GC所产生的停顿时间(用户等待时间)。
Java引用
1.Java强引用
定义:将一个对象赋给一个引用遍历,该引用变量就是一个强引用;强引用是使用最普遍的引用。
缺点:一个对象被强引用变量引用时,就处于可达状态,因此不会被垃圾回收机制回收,容易造成Java内存泄漏
2.Java弱引用
定义:使用WeakReference类实现,弱引用的对象只要垃圾回收机制一运行,无论内存空间是否足够,都会回收该对象所占用的内存。
3.Java软引用
定义:使用SoftReference类实现,软引用的对象当系统内存足够时不会被回收,内存不足时再被回收
4.Java虚引用
定义:使用PhantomReference类实现,必须与引用队列联合使用,无法单独使用
作用:跟踪对象被垃圾回收的状态