ProgramingTip

Java 7 및 8에서 메소드의 최대 크기

bestdevel 2020. 10. 17. 11:52
반응형

Java 7 및 8에서 메소드의 최대 크기


Java에서는 64KB보다 클 수있는 방법이 있습니다. 이 제한으로 인해 JavaCC 문법 에서 생성 된 코드에 문제가 발생합니다 . 우리는 Java 6에 문제가 문법을 변경하여 문제를 빨리 수 있습니다. Java 7에 대한 제한이 변경 또는 Java 8에 대한 계획입니까?

명확하게하기 위해서. 혼자서 64KB보다 큰 방법은 필요하지 않습니다. 그러나 저는 매우 큰 방법으로 문법을 썼습니다.


JVMS7 에 따르면 :

end_pc가 배타적이라는 사실은 Java 가상 머신 설계의 실수입니다. 메소드의 Java 가상 머신 코드 길이가 정확히 65535 바이트이고 길이가 1 바이트 인입으로 프로그램을 보호 할 수 없습니다. 예외적 인 경우에 의해. 컴파일러 작성자는 메소드, 인스턴스 초기화 메소드 또는 정적 이니셜 라이저 (모든 코드 배열의 크기)에 대해 생성 된 Java 가상 머신 코드의 최대 크기를 65534 바이트로 제한하여 버그를 수 있습니다.

그러나 이것은 Java 7. Java 8에 대한 최종 사양은 실제 개발자를 사용하는 누구도이 질문에 답할 수 없습니다.

UPD (2015 년 4 월 6 일) 에 따르면 JVM8 또한 마찬가지입니다 Java 8.


좋은 질문. 그렇듯이 우리는 항상 소스가서 답을 찾아야합니다 ( "JAVA® 가상 머신 사양" ). 이 섹션에서는 신중하게 제한 (Java6 VM 사양과 많음)을 많이 언급하지 않습니다.

메서드 (§2.6) 호출시 생성 된 프레임의 지역 변수 배열에서 지역 변수의 최대 개수는 코드 속성 (§4.7.3)의 max_locals 항목 크기에 따라 65535 개로 제한됩니다. 메소드 및 Java Virtual Machine 세트의 16 비트 로컬 변수 인덱싱을 사용합니다.

건배,


변경되지 않았습니다. 메소드의 코드 제한은 Java 7 및 Java 8 모두 여전히 64KB입니다.

참조 :

  1. Java 7 가상 머신 사양 ( 4.9.1 정적 제약 )에서 :

클래스 파일의 Java Virtual Machine 코드에 대한 제약 제약 조건은 Java Virtual Machine 지정을 코드 배열에 배치하는 방법과 오류의 피연산자가 무엇인지 확인합니다.

코드 배열의 좀에 대한 제약은 다음과 있습니다.

  • 코드 배열은 비워 둘 수 있습니다 code_length 항목은 0 값을 수 없습니다.
  • code_length 항목의 값은 65536보다 작아야합니다.
  1. Java 8 가상 머신 사양 ( 4.7.3 코드 속성 )에서 :

code_length 항목의 값은이 메서드에 대한 코드 배열의 바이트 수를 제공합니다.

code_length의 값은 0보다 선호하는 (코드 배열이 비어 있지 않은 배열) 65536보다 작아야합니다.


Andremoniy 이미이 질문의는 java 7일부에 답변했지만, 당시 결정을 그 내리는 것이 곧 결정 java 8되었으므로 해당 부분을 다루기 위해 답변을 완료했습니다.

jvms 에서 인용 :

end_pc가 배타적이라는 사실은 Java Virtual Machine 설계의 실수입니다. 메소드의 Java Virtual Machine 코드 길이가 정확히 65535 바이트이고 길이가 1 바이트 인급로 프로그램을 보호 할 수 없습니다. 예외적 인 경우에 의해. 컴파일러 작성자는 메소드, 인스턴스 초기화 메소드 또는 초기화 초기화 프로그램 (코드 배열의 크기)에 대해 Java Virtual Machine 코드의 최대 크기를 65534 바이트로 제한하여 버그를 처리 할 수 ​​있습니다.

보시 다시피이 역사적인 문제는 없어지지 않는 것입니다.


방법으로 해결 파서의 코드에, 대한 액세스 권한이있는 경우 'JVM 컴파일러에 의해 부과 된 한계'내에서 작동하도록 수정할 수 있습니다. (파서 코드에서 수정)

참고 URL : https://stackoverflow.com/questions/17422480/maximum-size-of-a-method-in-java-7-and-8

반응형