자바 8의 '클로저'와 약간 혼동 스럽습니다. 그것은 가치 이상으로 추정된다. 다음 클래스를 고려하십시오.Java 8 람다 클로저와 GC
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
});
}
}
.
//Let's assume SomeAsyncHelper.doAsync takes a VoidRunner that looks like below
interface VoidRunner {
void apply();
}
질문은 비동기 도우미가 여전히 작동 될 때 SomeClassWithLargeMemoryFootprint의 인스턴스가 GC'd 될 수있다? "someObj"는 doSomething()의 람다에서 필요하므로 GC로 지정할 수 없습니다. 나머지 국가는 어떨까요? 지금
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 시퀀스는 무엇입니까?
내가 아는 한 Java의 GC는 Java에서 참조 카운팅과 람다를 사용하여 인라인 클래스의 구문 론적 설탕에 지나지 않습니다. 긴 이야기 짧게 :이 모든 것을 인라인 클래스로 구현하는 것처럼 작동합니다. 인라인 클래스는 프라이빗 클래스이기 때문에 언제든지 주변 개체와 그 속성 및 메소드에 액세스 할 수 있습니다. 참조 카운팅은 객체의 나머지와 올바른 릴리스를 처리합니다 (람다가 실행 된 후에 일명). – Turing85
** 실제로는 중복되었지만 다른 질문이 있습니다. [Java8 람다가 익명 클래스와 같은 해당 인스턴스에 대한 참조를 유지합니까?] (https://stackoverflow.com/a/28447015/581205). ** See https://stackoverflow.com/a/23991339/581205. – maaartinus