MST

星途 面试题库

面试题:Java垃圾回收机制中常见的垃圾回收算法有哪些,简述其原理

在Java编程的垃圾回收机制里,阐述标记 - 清除算法、标记 - 整理算法以及复制算法这几种常见垃圾回收算法的基本原理,并说明它们各自的优缺点。
43.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

标记 - 清除算法

  1. 基本原理
    • 标记阶段:垃圾回收器从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
    • 清除阶段:遍历堆内存,回收所有未被标记的对象(即垃圾对象)所占用的空间。
  2. 优点
    • 实现简单,不需要额外的空间进行对象的移动。
  3. 缺点
    • 空间碎片化:回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配到足够连续的内存空间,即使总的空闲内存足够。
    • 效率问题:标记和清除两个过程效率都不高,标记需要遍历所有对象,清除需要遍历整个堆。

标记 - 整理算法

  1. 基本原理
    • 标记阶段:同标记 - 清除算法,从根对象开始标记所有可达对象。
    • 整理阶段:将所有存活的对象(被标记的对象)向一端移动,然后直接清理掉端边界以外的内存空间。
  2. 优点
    • 解决碎片化问题:通过移动存活对象,整理出连续的内存空间,避免了空间碎片化问题,有利于大对象的分配。
  3. 缺点
    • 移动开销:移动对象需要计算对象新的位置并更新引用,这增加了处理时间,尤其是在对象数量多的情况下。

复制算法

  1. 基本原理
    • 将内存分为大小相等的两块,每次只使用其中一块。当这一块内存使用完时,将存活对象复制到另一块空闲内存中,然后清除原来使用的那一块内存。
  2. 优点
    • 高效性:每次只对半个区域进行垃圾回收,且复制过程中不需要考虑内存碎片问题,效率较高。
    • 简单:算法逻辑相对简单,实现容易。
  3. 缺点
    • 空间浪费:需要两倍的内存空间来实现,因为始终有一半的内存处于空闲状态,以保证存活对象有地方复制。对于大对象的复制开销较大,如果大对象较多,可能会影响效率。