2017-11-10 6 views
1

값 유형이 Foo이고 Foo에 대한 참조를 허용하는 Bar 메서드가 있다고 가정 해보십시오. 대부분의 언어를 사용하면 스택에 새로운 Foo을 할당 할 수있게되며 Bar에 전달하면 자동으로 상자에 표시됩니다. 그러나 알고있는 한, Foo 값을 힙에 복사 한 다음 해당 참조를 사용합니다.가비지 수집 언어가 스택에 객체를 인라인으로 할당 할 수 있습니까?

언어에 가비지 수집 객체를 스택에 할당하는 방법을 포함 할 수 있습니까? 메소드가 끝나면 런타임은 객체가 아직 사용 중인지를 확인한 다음 힙에 객체를 할당하고 참조를 업데이트해야합니다.

이 방법은 참조를 유지하지 않는 메소드의 성능을 향상시킬 수 있으며 성능이 저하 될 수 있다고 생각합니다.

+1

예를 들어 Java에서 사용되는 [이탈 분석] (https://en.m.wikipedia.org/wiki/Escape_analysis)에 대해 읽어보십시오. –

+0

httftp://stackoverflow.com/questions/25903320/creating-objects-on-the-stack-memory-in-java – Raedwald

답변

1

예, Graal의 partial escape analysis입니다. 일반 EA는 객체가 이스케이프 처리되지 않을 때 스택 할당 (더 정확하게는 필드로 분해, 필드를 스택에 넣기) 만 할 수 있지만 부분적으로 EA는 스택에 낙관적으로 할당 할 수 있으며 드문 경우에는 개체를 데이터로 구체화 할 수 있습니다 존재해야합니다.

가비지 수집은 이진 선택 사항이 아닙니다. 가비지 콜렉션, 참조 횟수, 영역 또는 범위 기반 할당자를 자동 할당 해제 및 완전 수동 관리로 혼합하고 일치시키는 환경을 가질 수 있습니다. 이러한 경우 스택 할당은 후자 중 하나 일 수 있지만 일부 힙은 가비지 수집됩니다.

+0

TLAB 할당이 이미 스택 할당만큼 효율적으로 작동한다는 점에 유의할 가치가 있습니다. 가장 좋은 경우에 충돌하는 포인터는 OP에서 설명한 것보다 더 잘 작동하지만 메서드에 'Foo'를 전달할 때 객체를 복사 할 필요가 없으므로 실제로 해당 객체에 대한 참조를 힙 변수에 저장하더라도 필요하지 않습니다. 그러한 복사. 객체가 다음 GC에서 존속하는 경우에만 복사됩니다. EA 이후에 필드로 분해하는 것은 이후의 최적화를 가능하게하기 때문에 더 잘 작동합니다.이 필드는 로컬 변수처럼 취급됩니다. – Holger