2017-10-12 1 views
1
나의 이해에서

(및 https://www.javaworld.com/article/2076949/learn-java/how-the-java-virtual-machine-handles-method-invocation-and-return.html?page=2에 따라)는 JVM은 메소드 호출을 처리 는 발신자에서 수신자 팝 인수를위한 새로운 스택 프레임을 만들기 은 호출자를 실행 호 출처를 밀어 넣습니다.자바 메소드 호출 스택 복사

그러나 왜 우리는 한 스택 프레임에서 다른 스택 프레임으로 인수를 복사/이동해야합니까?

호출자의 최상위 슬롯 (인수 포함)이 피 호출자 스택 프레임의 맨 아래 슬롯이되도록 피 호출자에 대해 새롭고 겹치는 스택 프레임을 만드는 것이 더 쉽지 않을까요? 나중에 모든 것을 정리할 때 (팝업으로) 차이를 만들지 않아도되지만 복사를 피함으로써 메서드 호출의 효율성을 높일 수 있습니다.

그래서이 문제는 무엇입니까? 왜 이렇게하지 않습니까?

답변

2

인용하신 부분은 공식적인 과정을 설명합니다. 구현은 해당 설명과 호환 가능해야하지만 문자 그대로 같아야 할 필요는 없습니다. 당신은 그냥 넘어 몇 개의 문장을 읽으면

은, 당신을 찾을 것입니다 :

JVM을 사양은 자바 스택에 대한 특정 구현을 필요로하지 않습니다. 프레임은 힙에서 개별적으로 할당되거나 연속 메모리 또는 둘 다에서 가져올 수 있습니다. 하지 모든 구현은 당신이 제안처럼 최적화 할 수 이유를 설명

하지만

두 개의 프레임은, 그러나, 가상 머신은 단지 그들을 있도록 연속 겹칠 수있는 경우의 피연산자 스택의 상단 한 프레임은 다음 프레임의 로컬 변수의 맨 아래를 형성합니다. 이 체계에서 가상 시스템은 두 프레임이 겹치기 때문에 한 프레임에서 다른 프레임으로 objectref 및 arg를 복사 할 필요가 없습니다. 호출하는 메소드의 프레임에서 objectref를 포함하는 피연산자 스택 워드는 새 프레임의 로컬 변수 0과 동일한 메모리 위치가됩니다.

아무도 말하지 않았지만 제안 된 방식대로 구현되지는 않을 것입니다. 실제로이 최적화 기회는 명시 적으로 언급되었습니다. 그러나이 기사에서는 어떤 구체적인 JVM이 어떤 방식으로 스택을 구현하는지에 대해서는 언급하지 않았다.

최적화 된 핫 스폿의 경우 발신자가 호출자에게 인라인되지 않으면 호출 프로토콜이 완전히 다를 수 있으므로 모든 호출 아티팩트를 완전히 제거 할 수 있습니다.

관련 문제