什么是垃圾:
没有任何引用指向的一个对象或者多个对象(循环引用)
如何定位垃圾:
- 引用计数(ReferenceCount)(循环引用问题不好解决)
- 根可达算法(RootSearching)(本地方法、常量池、本地方法栈、已加载的静态属性)
常见的垃圾回收算法:
1.标记清除(mark sweep):
两遍扫描,第一遍将不可回收的对象标记,第二遍将可回收的对象清除
优点:在存活对象比较多的情况下,效率较高
缺点:位置不连续、产生碎片、效率偏低(两遍扫描)
2.拷贝算法 (copying):
内存一分为二,一遍扫描,找到不可回收的对象,拷贝到另一块内存中
优点:在存活对象比较少的情况下,效率高,没有碎片(适合年轻代:伊甸园区(8)、From Survivor区(1)、To Survivor区(1))
缺点:浪费空间(内存只能使用一半,移动对象、指针需要调整)
3.标记压缩(mark compact):
两遍扫描,第一遍将不可回收的对象标记,第二遍将不可回收的对象拷贝到前面可回收的对象位置上
优点:没有碎片,内存使用也不需要减半(适合老年代)
缺点:效率偏低(两遍扫描,移动对象、指针需要调整)