JVM 내부 정보를 최근에 읽었으며 해당 요소 중 하나 인 메소드의 피연산자 스택에 대한 질문이있었습니다. 최대 크기를 가지고 있으며 오버플로 할 수 있습니까? 수동으로 또는 어떤 상태로 인해 발생할 수 있습니까?Java 메소드 피연산자 스택
1
A
답변
1
최대 크기는 MaxStack 특성을 사용하여 메서드마다 설정됩니다. 더 큰 피연산자 스택 (또는 불확정 크기의 피연산자 스택)을 생성하면 검증 오류가 발생합니다. 따라서 실제로 동적으로 오버플로 할 수는 없다는 의미에서 정확합니다 (한도 내에서 유지됨) 또는로드하지 않습니다. MAXSTACK 속성 유형 UINT16이므로
, 넌
2 16 -1 슬롯 오퍼랜드 스택 크기를 지정할 수있다. 와이드 타입은 로컬 변수와 마찬가지로 2 슬롯을 사용합니다. 따라서 은 Java에서 실제로 큰 표현식을 읽을 수는 있지만 실제로는 javac
은 그 전에 오랜 시간 동안 스택 공간 (실제 스택 공간, 피연산자 스택이 아님)이 부족합니다.
속성이 잘못 설정된 경우 MaxStack 속성으로 설정 한 제한을 초과하면 쉽게 처리됩니다. ClassWriter가주의없이 사용되는 경우 가끔 발생합니다.
최대 크기는 JVM에 할당 된 메모리에서 이미 사용중인 메모리를 뺀 값으로 표시됩니다. –