如果父 class 不是,是否可以对 java 8 方法引用进行垃圾回收?
Can a java 8 method reference be garbage collected if the parent class isn't?
如果我有
public interface Foo {
public void oneMethod();
}
然后我还有一个class:
public class TestClass {
SoftReference sr;
public test() {
doSomething(this::lalala);
}
public lalala() {
}
public doSomethingFoo(Foo foo) {
sr = new SoftReference(foo);
//can sr.get() ever return null?
}
}
sr.get()
可以 return 为空吗?
也有兴趣了解在我们使用匿名内部 class 或非静态内部 class.
而不是方法引用的情况下的行为
为方法引用创建的实例的生命周期不依赖于方法引用的目标。它总是反过来,如果你的方法引用针对一个特定的实例,只要方法引用实例是可访问的,目标实例就不能被垃圾收集。
由于 Java 规范公开了如何创建和重用 lambda 表达式和方法引用的实例,因此也未指定它们将存在多长时间(参见 A:Does a lambda expression create an object on the heap every time it's executed?)。
实际上,在当前的实现中,不捕获任何值的实例会被记住和重用,因此与创建它们的 class 一样长。相比之下,捕获值的实例,并且 this::lalala
捕获 this
引用的值,不会被重用,一旦它们变得无法访问,就会被垃圾收集。
如果我有
public interface Foo {
public void oneMethod();
}
然后我还有一个class:
public class TestClass {
SoftReference sr;
public test() {
doSomething(this::lalala);
}
public lalala() {
}
public doSomethingFoo(Foo foo) {
sr = new SoftReference(foo);
//can sr.get() ever return null?
}
}
sr.get()
可以 return 为空吗?
也有兴趣了解在我们使用匿名内部 class 或非静态内部 class.
而不是方法引用的情况下的行为为方法引用创建的实例的生命周期不依赖于方法引用的目标。它总是反过来,如果你的方法引用针对一个特定的实例,只要方法引用实例是可访问的,目标实例就不能被垃圾收集。
由于 Java 规范公开了如何创建和重用 lambda 表达式和方法引用的实例,因此也未指定它们将存在多长时间(参见 A:Does a lambda expression create an object on the heap every time it's executed?)。
实际上,在当前的实现中,不捕获任何值的实例会被记住和重用,因此与创建它们的 class 一样长。相比之下,捕获值的实例,并且 this::lalala
捕获 this
引用的值,不会被重用,一旦它们变得无法访问,就会被垃圾收集。