JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)
发布人:shili8
发布时间:2024-12-23 20:27
阅读次数:0
**Java虚拟机回收算法**
在 Java 虚拟机中,垃圾回收是为了回收内存中的无用对象而设计的。垃圾回收算法有三种主要类型:标记-清除算法、复制算法和标记-整理算法。
###1. 标记-清除算法**概述**
标记-清除算法是最基本的垃圾回收算法。它分为两个阶段:标记和清除。
* **标记阶段**: JVM 会遍历所有对象,找出哪些对象是活跃的(即被引用),并将这些对象标记为“活跃”。
* **清除阶段**: JVM 会遍历所有对象,找出哪些对象没有被标记为“活跃”,并回收这些对象所占用的内存。
**优缺点**
优点:
* 简单易实现* 无需预先分配内存缺点:
* 效率较低,因为清除阶段需要遍历所有对象,导致 JVM 需要暂停执行应用程序。
* 可能会出现碎片化问题,即回收后可能会产生一些小块的空闲内存。
**示例代码**
javapublic class MarkAndSweep { public static void main(String[] args) { // 创建一个对象 Object obj = new Object(); // 标记阶段:将 obj 标记为活跃 mark(obj); // 清除阶段:回收没有被标记的对象 sweep(); } private static void mark(Object obj) { System.out.println("标记阶段:" + obj); } private static void sweep() { System.out.println("清除阶段:回收无用对象"); } }
###2. 复制算法**概述**
复制算法是将内存分为两部分,每次只使用其中一半。每次垃圾回收时,会将活跃的对象复制到另一半内存中,然后清除原来的内存。
**优缺点**
优点:
* 可以避免碎片化问题* 效率较高,因为只需要复制活跃的对象,而不需要遍历所有对象缺点:
* 需要预先分配两倍于当前使用内存大小的内存空间* 如果有大量活跃对象,可能会导致内存占用过多**示例代码**
javapublic class Copying { public static void main(String[] args) { // 创建一个对象 Object obj = new Object(); // 复制阶段:将 obj 复制到另一半内存中 copy(obj); // 清除阶段:回收原来的内存 sweep(); } private static void copy(Object obj) { System.out.println("复制阶段:" + obj); } private static void sweep() { System.out.println("清除阶段:回收无用对象"); } }
###3. 标记-整理算法**概述**
标记-整理算法是将所有存活的对象都向一端移动,然后清除掉边界以外的内存。
**优缺点**
优点:
* 可以避免碎片化问题* 效率较高,因为只需要遍历所有对象一次缺点:
* 需要预先分配足够大的内存空间* 如果有大量活跃对象,可能会导致内存占用过多**示例代码**
javapublic class MarkAndCompact { public static void main(String[] args) { // 创建一个对象 Object obj = new Object(); // 标记阶段:将 obj 标记为活跃 mark(obj); // 整理阶段:将所有存活的对象向一端移动 compact(); // 清除阶段:回收边界以外的内存 sweep(); } private static void mark(Object obj) { System.out.println("标记阶段:" + obj); } private static void compact() { System.out.println("整理阶段:将所有存活的对象向一端移动"); } private static void sweep() { System.out.println("清除阶段:回收无用对象"); } }
综上所述,垃圾回收算法有三种主要类型:标记-清除算法、复制算法和标记-整理算法。每种算法都有其优缺点和使用场景。选择合适的算法需要根据具体需求进行权衡。