代码之家  ›  专栏  ›  技术社区  ›  Hind Forsum

System.gc()之后未释放Java弱引用

  •  0
  • Hind Forsum  · 技术社区  · 6 年前

    Integer integer = 2;
    WeakReference<Integer> wi = new WeakReference<>(integer);
    WeakReference<Integer> sr = new WeakReference<>(new Integer(3));
    System.out.println(wi.get());
    System.out.println(sr.get());
    System.gc();
    System.out.println("step 1 wi = " + wi.get());
    System.out.println("step 1 sr =: " + sr.get());
    integer = null;
    System.gc();
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("step 1 wi = " + wi.get());
    System.out.println("step 1 sr =: " + sr.get());
    

    但即使设置了“integer=null”,wi也拒绝为null。而sr在“System.gc()”之后正好为null。它打印:

    2
    3
    step 1 wi = 2
    step 1 sr =: null
    step 1 wi = 2
    step 1 sr =: null
    

    (1) wi和sr的核心区别是什么?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   rzwitserloot    6 年前

    这与以下两个事实都没有任何关系 System.gc()

    j.l.Integer类保存一个实例的“缓存” Integer

    System.out.println(Integer.valueOf(127) == Integer.valueOf(127));
    System.out.println(Integer.valueOf(128) == Integer.valueOf(128));
    

    true false .

    此代码:

    Integer x = 2;
    

    语法是糖。编译器最终编译的是以下代码,因为“自动装箱”是javac想象的虚构(JVM对此一无所知,完全是javac为您完成的):

    Integer x = Integer.valueOf(2);
    

    当然,如果你打电话 new Integer

    System.out.println(new Integer(5) == new Integer(5));
    

    上面的照片 false .

    java.lang.Integer wi 因此,它永远不会被收集。

    重试完全相同的代码,但这一次,请尝试“=128”,而不是“=2”,这一次它将收集与sr相同的代码。