2009-11-24 2 views
2

JVM 및 .NET VM은 객체 수명이 특정 범위로 제한된다는 것을 런타임에 명백히 알 때 스택에 객체를 할당합니까?JVM 및 CLR 할당 최적화

+1

* 분명 * 할 때 좀더 자세히 설명해 주시겠습니까? 나는 그것에 대해 잘 모르겠다 ... –

+0

글쎄, C, C++ 세계에서 오는 것 같다. 자바와 .NET에서 VM은 객체에 대한 모든 참조를 알고있다. 메소드 내에서 객체를 생성하고 그 객체를 다른 곳으로 전송하지 않으면 스택에 유지하는 것이 좋습니다. 어쨌든 인수를 전달하기위한 스택이 존재하기 때문에 초고속 (및 슈퍼 단순) 스택 할당의 이점을 얻지 못하는 이유는 무엇입니까? –

답변

5

JVM이 수행합니다. 적절한 상황에서 실제로 할당을 완전히 제거 할 수 있습니다. 이 article.

자바 언어를 인용

명시 적으로 스택에 객체를 할당 할 수있는 방법을 제공하지 않지만,이 사실은 적절한 여전히 스택 할당을 사용하는 JVM을 방지하지 않습니다. JVM은 이스케이프 분석이라는 기술을 사용할 수 있습니다.이 기술을 통해 특정 객체가 전체 수명 동안 단일 스레드로 제한되고 그 수명이 주어진 스택 프레임의 수명으로 제한된다는 것을 알 수 있습니다. 이러한 개체는 힙 대신 스택에 안전하게 할당 할 수 있습니다. 더 작은 오브젝트의 경우, JVM은 할당을 완전히 최적화하여 객체의 필드를 레지스터로 끌어 올 수 있습니다.

자세한 내용은 위키 백과에서 Escape analysis을 클릭하십시오.

+0

JVM의 어떤 버전이이 작업을 수행합니까? 더 중요한 것은 최근의 Escape Analysis를 지원합니까? –

+2

Java 6 업데이트 14, 명령 줄 옵션으로 활성화해야했습니다. (-XX : + DoEscapeAnalysis). 18 번 업데이트에서 제거 된 다음 21 번 업데이트에서 다시 추가 된 것처럼 보입니다. 명령 줄 옵션이 여전히 필요한지 여부는 확실하지 않지만 안전하다고 생각합니다. –