gpt4 book ai didi

java - 为什么这个弱监听器没有被垃圾收集?

转载 作者:行者123 更新时间:2023-11-29 10:11:42 27 4
gpt4 key购买 nike

这是 Kishori Sharan 的 Learn JavaFX 8 一书中的示例:

package sample;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.WeakChangeListener;

public class WeakListener {
public static IntegerProperty counter = new SimpleIntegerProperty(100);
public static WeakChangeListener<Number> weakListener;
public static ChangeListener<Number> changeListener;

public static void main(String[] args) {
// Add a weak change listener to the property
addWeakListener();
counter.set(300);
System.gc();
System.out.println("Garbage collected: " +
weakListener.wasGarbageCollected());
counter.set(400);
changeListener = null;
System.gc();
System.out.println("Garbage collected: " +
weakListener.wasGarbageCollected());
counter.set(500);
}

public static void addWeakListener() {
changeListener = WeakListener::changed;
weakListener = new WeakChangeListener<>(changeListener);
counter.addListener(weakListener);
counter.set(200);
}

public static void changed(ObservableValue<? extends Number> prop,
Number oldValue,
Number newValue) {
System.out.print("Counter changed: ");
System.out.println("old = " + oldValue + ", new = " + newValue);
}
}

弱监听器应该在强监听器设置为空后被GC:

enter image description here

但结果并不如预期:

Counter changed: old = 100, new = 200
Counter changed: old = 200, new = 300
Garbage collected: false
Counter changed: old = 300, new = 400
Garbage collected: false
Counter changed: old = 400, new = 500

我在 OSX 优胜美地上使用 jdk 1.8_u51。

最佳答案

恐怕这篇文章是错误的 - 这里是更正的句子:

After you set it to null and then invoke the garbage collection again, the change listener may be garbage collected.

本质上,Java 中没有 System.gc(); 的契约。看写法here它的状态(我的重点):

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

没有任何内容表明它实际上会收集任何垃圾。

关于java - 为什么这个弱监听器没有被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com