Java WeakReference GC已完成,尚未完成?

问题描述 投票:0回答:1

我以为WeakReference引用对象将在System.gc()调用后完成,但是我错了。

这里有两个测试用例,唯一的区别是WeakReference构造函数,第一个是新对象,而第二个使用引用,并且它们具有不同的性能,我不知道为什么...

  • 弱引用对象,不会阻止其引用对象成为对象
  • 已定型,定型然后回收。参考文献最弱
  • 通常用于实现规范化映射。*
  • 假设垃圾收集器在某个时间点确定

  • 物体弱弱
  • 可达。到那时,它将自动清除所有对
  • 的弱引用
  • 该对象和对所有其他弱可达对象的所有弱引用
  • 通过坚固和柔软的链从该物体可以到达
  • 参考。同时它将声明所有以前的
  • 弱可达对象要完成。同时或在某些时候
  • 稍后它将排队那些新近清除的弱引用是>
  • 在参考队列中注册。
package com.zeng.javaReference;

import org.junit.Test;

import java.lang.ref.WeakReference;

/**
 * @author zeng
 * @version 1.0.0
 * @date 2020-05-11
 */
public class WeakReferenceTest {

    @Test
    public void weakRefRemoved() {
        WeakReference<Apple> weakReference = new WeakReference<>(new Apple("green-apple"));

        System.gc();

        if (weakReference.get() == null) {
            System.out.println("GC remove weakReference!");
        } else {
            System.out.println("weakReference still alive");
        }
    }

    @Test
    public void weakRefNotRemoved() {
        Apple apple = new Apple("green-apple");
        WeakReference<Apple> weakReference = new WeakReference<>(apple);

        System.gc();

        if (weakReference.get() == null) {
            System.out.println("GC remove weakReference!");
        } else {
            System.out.println("weakReference still alive");
        }
    }

    public static class Apple {

        private String name;

        public Apple(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println("Apple: " + name + " finalized。");
        }

        @Override
        public String toString() {
            return "Apple{" +
                    "name='" + name + '\'' +
                    '}' + ", hashCode:" + this.hashCode();
        }
    }

}

我以为WeakReference引用对象将在System.gc()调用后完成,但是我错了。这是两个测试用例,唯一的区别是WeakReference构造函数,第一个是新对象...

java weak-references
1个回答
0
投票

[System.gc()可能会或可能不会触发垃圾回收。

© www.soinside.com 2019 - 2024. All rights reserved.