Java教程34—Java垃圾回收

当JVM启动时,它会创建一个堆区域,称为运行时数据区域。
这是存储所有对象(类的实例)的地方。
由于该区域有限,因此需要通过移除不再使用的对象来有效地管理该区域。
从堆内存中删除未使用的对象的过程称为垃圾收集,这是Java中内存管理的一部分。

像C/C++ 这样的语言不支持自动垃圾收集,但在java中,垃圾收集是自动的。


那啥时候java执行垃圾收集?

1、当对象不可到达时

BeginnersBook obj = new BeginnersBook();  
obj = null;

这里引用obj指向类BeginnersBook的对象,但由于我们为它分配了一个空值,因此它不再指向该对象。
这使得BeginnersBook对象无法访问,因此无法使用。
这些对象可自动用于Java中的垃圾收集。

另一个例子是:

char[] sayhello = { 'h', 'e', 'l', 'l', 'o'};
String str = new String(sayhello);
str = null;

这里String类的引用str指向堆内存中的字符串“hello”,但由于我们已将空值赋给str,因此堆内存中存在的对象“hello”不可用。


2.将一个引用复制到另一个引用时

BeginnersBook obj1 = new BeginnersBook ();
BeginnersBook obj2 = new BeginnersBook (); 
obj2 = obj1 ;  

这里我们将引用obj1分配给obj2,这意味着obj2指向的(引用)实例(对象)不可访问并且可用于垃圾收集。


如何请求JVM进行垃圾回收

我们现在知道无法访问和不可用的对象可用于垃圾收集,但垃圾收集过程不会立即发生。
这意味着一旦对象准备好进行垃圾回收,他们就必须等待JVM运行执行垃圾收集的内存清理程序。
但是,您可以通过调用System.gc()方法请求JVM进行垃圾回收(请参阅下面的示例)。

Java中的垃圾收集示例
在这个例子中,我们通过调用System.gc()来演示垃圾收集。
在这段代码中,我们重写了finalize()方法。
在Java销毁对象之前调用此方法。这就是您在输出中看到此方法已被调用两次的原因。

public class JavaExample{
    public static void main(String args[]){
        /*
         * 给一个引用赋空值
         */
        JavaExample obj=new JavaExample();
        obj=null;

        /* 把引用a赋值给b
         */
        JavaExample a = new JavaExample();
        JavaExample b = new JavaExample();
        b = a;
        System.gc();
    }
    protected void finalize() throws Throwable
    {
        System.out.println("Garbage collection is performed by JVM");
    }
}

原文地址;

https://beginnersbook.com/2013/04/java-garbage-collection/

猜你喜欢

转载自blog.csdn.net/y396397735/article/details/82750577