搜索

首页  >  问答  >  正文

垃圾回收 - java 如何手动回收对象

先上代码吧,我的目的是让data这个数据彻底消失

public class Test {
    public static void main(String[] args) {
        Data data = new Data();
        data.num = 10;

        Data new1 = data;
        Data new2 = data;
        new2 = null;
        data = null;
        System.out.println(new1.num);
    }

}

class Data {
    int num;
}

我知道java的垃圾回收机制,只有有东西还在引用他,他就不会消失,像上面的代码依然能够正常输出10.
但是我想知道该怎么做,能让System.out.println(new1.num);抛出null异常,即彻底没有这个数据
不要说让new1=null就行

为情所困为情所困2753 天前1050

全部回复(5)我来回复

  • 迷茫

    迷茫2017-05-17 10:07:31

    你自己都说了"我知道java的垃圾回收机制,只有有东西还在引用他,他就不会消失", "new1"这个变量还在引用 "new Data()"在堆里那块内存,怎么可能会让他被回收,这样我们写的代码不全是空指针异常。你可以使用WeakReference,而不是强引用。

        WeakReference<Data> new1 = new WeakReference(data);
        Data new2 = data;
        new2 = null;
        data = null;
        System.gc();//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的 ,所以下面延迟2秒
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(new1.get().num);

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-17 10:07:31

    System.gc();

    建议JVM执行gc,有可能完全被拒绝。 GC本身是会周期性的自动运行的,由JVM决定运行的时机,而且现在的版本有多种更智能的模式可以选择,还会根据运行的机器自动去做选择,就算真的有性能上的需求,也应该去对GC的运行机制进行微调,而不是通过使用这个命令来实现性能的优化。

    回复
    0
  • PHP中文网

    PHP中文网2017-05-17 10:07:31

    有对象引用即将删除的对象仍然可以置为null

        {
            OutClass outClass1 = new OutClass();
            OutClass outClass2 = new OutClass();
            outClass2.outClass = outClass1;
            outClass1 = null;
            System.out.print(outClass1);
        }
        
        class OutClass {
            public OutClass outClass;
        }

    回复
    0
  • ringa_lee

    ringa_lee2017-05-17 10:07:31

    在你没有理解JMM原理之前,千万不要乱用System.gc(),对象用完obj=null;就可以了。

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-17 10:07:31

    答案是不能,这属于JVM规范中未定义的行为,开发者不应该试图手动的去帮助虚拟机回收一个对象。如果是sun的JDK,好像有一个unsafe的包,不过我没用过,不知道有没有这样的API。

    回复
    0
  • 取消回复