Tamaño máximo de un método en Java 7 y 8

Sé que un método no puede tener más de 64 KB con Java. La limitación nos causa problemas con el código generado de una gramática JavaCC . Tuvimos problemas con Java 6 y pudimos solucionarlo cambiando la gramática. ¿Se ha modificado el límite para Java 7 o está previsto para Java 8?

Sólo para que quede claro. No necesito un método de más de 64 KB solo. Pero escribí una gramática que comstack a un método muy grande.

De acuerdo con JVMS7 :

El hecho de que end_pc sea exclusivo es un error histórico en el diseño de la máquina virtual Java: si el código de la máquina virtual Java para un método tiene exactamente 65535 bytes de longitud y finaliza con una instrucción de 1 byte de longitud, esa instrucción no puede protegerse por un controlador de excepción. Un escritor de comstackdores puede evitar este error limitando el tamaño máximo del código de máquina virtual Java generado para cualquier método, método de inicialización de instancias o inicializador estático (el tamaño de cualquier matriz de códigos) a 65534 bytes.

Pero esto es sobre Java 7 . No hay especificaciones finales para Java 8, por lo que nadie (excepto sus desarrolladores) podría responder esta pregunta.

UPD (2015-04-06) Según JVM8 , también es cierto para Java 8 .

Buena pregunta. Como siempre, deberíamos ir a la fuente para encontrar la respuesta ( “La especificación de la máquina virtual Java®” ). La sección no menciona explícitamente un límite (como lo hizo la especificación VM de Java6), pero con cierta circunspección:

El mayor número de variables locales en el conjunto de variables locales de un cuadro creado al invocar un método (§2.6) está limitado a 65535 por el tamaño del elemento max_locals del atributo de Código (§4.7.3) que proporciona el código del método, y por la indexación de variables locales de 16 bits del conjunto de instrucciones de Java Virtual Machine.

Aclamaciones,

No ha cambiado El límite de código en los métodos es aún de 64 KB tanto en Java 7 como en Java 8.

Referencias

  1. De la especificación de máquina virtual Java 7 ( 4.9.1 Restricciones estáticas ):

Las restricciones estáticas en el código de Java Virtual Machine en un archivo de clase especifican cómo se deben presentar las instrucciones de Java Virtual Machine en la matriz de códigos y cuáles deben ser los operandos de las instrucciones individuales.

Las restricciones estáticas en las instrucciones en el conjunto de códigos son las siguientes:

  • El conjunto de códigos no debe estar vacío, por lo que el elemento code_length no puede tener el valor 0.
  • El valor del elemento code_length debe ser menor que 65536.
  1. De la especificación de máquina virtual de Java 8 ( 4.7.3 El atributo de código ):

El valor del elemento code_length proporciona la cantidad de bytes en la matriz de códigos para este método.

El valor de code_length debe ser mayor que cero (ya que el conjunto de códigos no debe estar vacío) y menos de 65536.

Andremoniy ya ha respondido a la parte de java 7 de esta pregunta, pero parece que en ese momento era pronto para decidir sobre java 8 así que completé la respuesta para cubrir esa parte:

Citando de jvms :

El hecho de que end_pc sea exclusivo es un error histórico en el diseño de la máquina virtual Java: si el código Java Virtual Machine para un método tiene exactamente 65535 bytes de longitud y finaliza con una instrucción de 1 byte de longitud, esa instrucción no puede protegerse por un controlador de excepción. Un escritor de comstackdores puede evitar este error limitando el tamaño máximo del código Java Virtual Machine generado para cualquier método, método de inicialización de instancias o inicializador estático (el tamaño de cualquier matriz de códigos) a 65534 bytes.

Como ve, parece que este problema histórico no parece remediar al menos en esta versión (java 8).

Como solución alternativa, y si tiene acceso al código del analizador, puede modificarlo para que funcione dentro de los límites impuestos por el comstackdor de JVM … (Suponiendo que no demore una eternidad encontrar las partes en el código del analizador para modificar)