什么是垃圾?
垃圾指的是在运行程序中没有任何指针指向的对象。垃圾回收的本质是清除掉内存中的已死对象,回收所占用的堆内存。使得该空间可以被再次使用。
垃圾回收的主要区域:
a.方法区:主要回收常量池中废弃的常量(字面量及符号引用)及不再使用的类型
b.堆空间:回收垃圾(没有任何指针指向的对象)
(1)标记-清除算法:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。
(2)标记-复制算法:为了解决标记-清除算法面对大量可回收对象时执行效率低的问题,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
(3)标记-整理算法:其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。标记-清除算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。
参考文献:《深入理解Java虚拟机第三版》