面试题答案
一键面试1. CMS(Concurrent Mark Sweep)回收器
- 原理:采用“标记-清除”算法,在应用程序运行过程中,并发地进行垃圾回收。它首先暂停应用程序(初始标记阶段),标记出与GC Roots直接相连的对象;接着并发标记阶段,与应用程序同时运行,标记出所有可达对象;再暂停应用程序(重新标记阶段),修正并发标记期间因程序运行导致的标记变动;最后并发清除阶段,在应用程序运行时,清除标记为垃圾的对象。
- 适用场景:适用于对响应时间要求较高的应用场景,例如在线交易系统等,因为它能尽量减少垃圾回收过程中应用程序的停顿时间。
2. G1(Garbage-First)回收器
- 原理:将堆内存划分为多个大小相等的Region,在回收时,优先回收垃圾最多的Region(这也是“Garbage-First”名称的由来)。它首先初始标记,暂停应用程序,标记出与GC Roots直接相连的对象;然后并发标记,与应用程序并发运行,标记出所有可达对象;再混合回收,根据垃圾占比,选择部分Region进行回收,在回收过程中采用复制算法,避免内存碎片。
- 适用场景:适用于堆内存较大,追求高吞吐量和低停顿时间的场景,对于HBase这样的大数据存储系统,当数据量较大且对响应时间有一定要求时比较适用。
3. Serial回收器
- 原理:采用“标记-复制”或“标记-整理”算法,在垃圾回收时,会暂停所有应用线程,单线程进行垃圾回收工作。它先标记出所有存活对象,然后将存活对象复制到另一块内存区域(标记-复制),或者在原内存区域整理存活对象(标记-整理),清除垃圾对象。
- 适用场景:适用于小内存应用场景,由于是单线程回收,在堆内存较小的情况下,简单高效,例如一些嵌入式设备上的Java应用。
4. Parallel回收器
- 原理:与Serial回收器类似,但采用多线程进行垃圾回收,在垃圾回收时同样会暂停应用程序。采用“标记-复制”或“标记-整理”算法,多个线程并行标记和处理存活对象,提高回收效率。
- 适用场景:适用于对吞吐量要求较高的应用场景,例如批处理任务等,能在较短时间内完成垃圾回收,使应用程序有更多时间处理业务逻辑。