JVM标记清除算法是一种垃圾回收算法,它通过两个步骤来回收内存:
-
标记:标记所有被使用的内存。
-
清除:清除所有未被标记的内存。
下面是一个使用Java代码演示的例子:
public class MyClass {
private static final int MB = 1024 * 1024;
public static void main(String[] args) {
// 创建一个大型数组
Integer[] array = new Integer[500 * MB];
// 循环遍历数组并随机赋值,这会生成许多不需要的临时对象
for (int i = 0; i < array.length; i++) {
array[i] = Double.valueOf(Math.random());
}
// 将数组置为空,以便触发jvm的垃圾回收
array = null;
// 为了让垃圾回收有足够的时间清除不需要的对象,我们暂停程序一段时间
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 手动调用垃圾回收器
System.gc();
}
}
在这个例子中,我们创建了一个大型数组,并随机给它赋值。由于我们使用了包装类Double来封装double类型的值,因此这个过程会生成一些不需要的临时对象。当数组置为null时,这些临时对象和未被使用的数组元素都变成了不可达对象。在暂停一段时间之后,我们手动调用了System.gc()方法来触发JVM的垃圾回收。JVM将遍历并标记所有可达的对象,并清除所有不可达对象。这个例子演示了标记清除算法在内存清理方面的作用。