programing

lamda 표현식은 실행될 때마다 힙에 개체를 생성합니까?

bestcode 2022. 8. 29. 22:12
반응형

lamda 표현식은 실행될 때마다 힙에 개체를 생성합니까?

Java 8의 새로운 구문설탕을 사용하여 컬렉션에 대해 반복할 때 다음과 같이 됩니다.

myStream.forEach(item -> {
  // do something useful
});

이것은 아래의 '구 구문' 스니펫에 해당하지 않습니까?

myStream.forEach(new Consumer<Item>() {
  @Override
  public void accept(Item item) {
    // do something useful
  }
});

은 익명성을 합니까?Consumer오브젝트는 컬렉션에서 반복할 때마다 힙에 생성됩니다.이 작업에는 얼마나 많은 힙 공간이 필요합니까?포먼스에미 ?향??? ????즉, 대규모 멀티 레벨 데이터 구조에서 반복할 때 기존 방식을 루프에 사용해야 합니까?

그것은 동일하지만 동일하지는 않다.간단히 말하면 람다 식이 값을 캡처하지 않으면 호출할 때마다 다시 사용되는 싱글톤이 됩니다.

동작은 정확하게 지정되어 있지 않습니다.JVM에는 구현 방법에 대한 큰 자유가 주어집니다.현재 Oracle의 JVM은 람다 식당 인스턴스를 하나 이상 생성하지만(즉, 서로 다른 동일한 식 간에 인스턴스를 공유하지 않음) 값을 캡처하지 않는 모든 식에 대해 싱글톤을 생성합니다.

자세한 내용은 이 답변을 참조하십시오.거기서, 보다 상세한 설명 뿐만이 아니라, 현재의 동작을 관찰하기 위한 코드 테스트도 실시했습니다.


이는 Java® 언어 사양, "15.27.4. Lambda런타임 평가" 장에서 다룹니다.

요약:

이러한 규칙은 다음과 같은 점에서 Java 프로그래밍 언어의 구현에 유연성을 제공하기 위한 것입니다.

  • 모든 평가에서 새 개체를 할당할 필요는 없습니다.

  • 서로 다른 람다 식에 의해 생성된 개체는 서로 다른 클래스에 속할 필요가 없습니다(예: 본문이 동일한 경우).

  • 평가에 의해 생성된 모든 객체는 같은 클래스에 속할 필요는 없습니다(캡처된 로컬 변수 등이 인라인으로 표시될 수 있습니다).

  • "기존 인스턴스"를 사용할 수 있는 경우 이전 람다 평가에서 만들 필요가 없습니다(예를 들어 둘러싸는 클래스의 초기화 중에 할당되었을 수 있습니다).

람다를 나타내는 인스턴스가 민감하게 생성되는 시기는 람다 본문의 정확한 내용에 따라 달라집니다.즉, 핵심 요인은 람다가 어휘 환경에서 포착하는 것이다.작성에서 작성까지 가변적인 상태를 캡처하지 않으면 for-loop이 입력될 때마다 인스턴스가 생성되지 않습니다.대신 컴파일 시 합성 메서드가 생성되고 람다 사용 사이트는 해당 메서드에 위임된 싱글톤 객체를 수신합니다.

또한 이 측면은 구현에 따라 다르므로 HotSpot에서 효율성을 높이기 위한 향후 개선 및 발전을 기대할 수 있습니다.예를 들어, 단일 메서드에 전달하기에 충분한 정보를 가진 완전한 클래스 없이 경량 객체를 만드는 일반적인 계획이 있다.

이 토픽에 관한 상세하고 알기 쉬운 좋은 기사입니다.

http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

새 인스턴스를 에 전달하고 있습니다.forEach방법.이 작업을 수행할 때마다 새 개체를 만들지만 모든 루프 반복에 대해 개체를 만들지 않습니다.반복은 내부에서 이루어집니다.forEach루프가 완료될 때까지 동일한 '콜백' 객체 인스턴스를 사용하는 메서드.

따라서 루프가 사용하는 메모리는 수집 크기에 의존하지 않습니다.

이것은 '구 구문' 스니펫에 해당하지 않나요?

네. 아주 낮은 수준에서 약간의 차이가 있지만 신경 쓰지 않으셔도 될 것 같아요.Lamba 표현식에서는 어나니머스 클래스 대신 호출된 기능을 사용합니다.

언급URL : https://stackoverflow.com/questions/27524445/does-a-lambda-expression-create-an-object-on-the-heap-every-time-its-executed

반응형