【发布时间】:2022-01-11 12:49:30
【问题描述】:
考虑这个类:
class Stream<A>{
Supplier<A> headSupplier;
Supplier<Stream<A>> tailSupplier;
public Stream<A> take(int n) {
return n <= 0
? empty()
: new Stream(this.headSupplier, () -> this.tail().take(n - 1));
}
//other code
}
现在考虑这个方法:
Stream<Integer> someMethod(){
Stream<Integer> A = ...;
return A.take(10);
}
还有另一种方法:
Stream<Integer> B = someMethod();
someMethod() 返回时会发生什么,对A 的引用是否仍保留在内存中
因为当我们在B 上调用tail() 时需要它?如果是这样,这不是内存泄漏或效率低下吗?我们如何防止它?
【问题讨论】:
-
一般来说,与惰性求值相关的内存消耗很难预测。内存泄漏可能会出现 * 如果引用被持有太久 * 如果不必要的引用保持活动状态 * 如果创建了不必要的表达式(嵌套的空函数)。您可以将惰性求值视为表达式求值和内存使用之间的权衡。
标签: java functional-programming garbage-collection