首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 lambda闭包和GC

Java 8 lambda闭包和GC
EN

Stack Overflow用户
提问于 2017-10-31 20:24:39
回答 1查看 1.2K关注 0票数 5

我有点困惑于java 8的“闭包”。据推测,它比价值更接近。考虑下一节课。

代码语言:javascript
复制
public class SomeClassWithLargeMemoryFootprint {
     //some state
     private SomeObject someObj;
     //some more state

     public void doSomething(SomeAsyncHelper helper) {
         helper.doAsync( () -> {
                             //some super slow operation
                             int foo = someObj.whatever();
                             //some more stuff    
                       });
     }
}

代码语言:javascript
复制
//Let's assume SomeAsyncHelper.doAsync takes a VoidRunner that looks like below
interface VoidRunner {
    void apply();
}

问题是,当异步助手仍在工作时,SomeClassWithLargeMemoryFootprint的实例可以被GC化吗?在我看来,"someObj“不能像doSomething()中的lambda所要求的那样被GC控制。那州其他地方呢?

另外,考虑以下变量,其中我们调用包含类的成员方法:

代码语言:javascript
复制
public class SomeClassWithLargeMemoryFootprint {
     //some state
     private SomeObject someObj;
     //some more state

     public void doSomething(SomeAsyncHelper helper) {
         helper.doAsync( () -> {
                //do something
                memberMethod();
                //do something else
                });
     }

     private void memberMethod() {
         //do something
     }

}

现在怎么办?‘助手’如何知道如何执行"memberMethod"?它是否获得对SomeClassWithLargeMemoryFootprint实例的引用?GC序列是什么?

EN

回答 1

Stack Overflow用户

发布于 2017-10-31 20:32:34

当异步助手仍在工作时,SomeClassWithLargeMemoryFootprint的实例可以被GC化吗?

不是的。VoidRunner实例对其封闭的SomeClassWithLargeMemoryFootprint对象有很强的引用,异步任务执行器以某种方式引用了它本身。所以不可能是GCed。

那州其他地方呢?

状态的其余部分由SomeClassWithLargeMemoryFootprint实例引用,因此不能是GCed。

‘助手’如何知道如何执行"memberMethod“

在第一个示例中,它知道如何访问someObj(即this.someObj):它具有对其封闭的SomeClassWithLargeMemoryFootprint对象(即this)的引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47043967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档