web-dev-qa-db-fra.com

Taille maximale d'une méthode en Java 7 et 8

Je sais qu'une méthode ne peut pas dépasser 64 Ko avec Java. La limitation nous cause des problèmes avec le code généré à partir d'une grammaire JavaCC . Nous avons eu des problèmes avec Java 6 et avons pu résoudre ce problème en changeant la grammaire. La limite a-t-elle été modifiée pour Java 7 ou est-elle prévue pour Java 8?

Juste pour clarifier. Je n'ai pas besoin d'une méthode supérieure à 64 Ko par moi-même. Mais j'ai écrit une grammaire qui se compile en une très grande méthode.

76
LaurentG

Selon JVMS7 :

Le fait que end_pc soit exclusif est une erreur historique dans la conception de la machine virtuelle Java: si le code de la machine virtuelle Java pour une méthode est exactement de 65535 octets) long et se termine par une instruction de 1 octet de long, alors cette instruction ne peut pas être protégée par un gestionnaire d'exceptions. Un rédacteur du compilateur peut contourner ce bogue en limitant la taille maximale du Java virtual code machine pour n'importe quelle méthode, méthode d'initialisation d'instance ou initialiseur statique (la taille de n'importe quel tableau de code) à 65 534 octets.

Mais il s'agit de Java 7Il n'y a pas de spécifications finales pour Java 8, donc personne (sauf ses développeurs) n'a pu répondre à cette question.

UPD (2015-04-06) Selon JVM8 c'est également vrai pour Java 8.

56
Andremoniy

Bonne question. Comme toujours, nous devons aller à la source pour trouver la réponse ( "The Java® Virtual Machine Specification" ). La section ne mentionne pas explicitement de limite (comme l'a fait la spécification Java6 VM), mais de façon assez circonspecte:

Le plus grand nombre de variables locales dans le tableau de variables locales d'une trame créée lors de l'appel d'une méthode (§2.6) est limité à 65535 par la taille de l'élément max_locals de l'attribut Code (§4.7.3) donnant le code de la , et par l'indexation des variables locales 16 bits du jeu d'instructions Machine virtuelle Java Java.

À votre santé,

10
Anders R. Bystrup

Cela n'a pas changé. La limite de code dans les méthodes est toujours de 64 Ko dans les deux Java 7 et Java 8.

Références:

  1. À partir de la spécification Java 7 Virtual Machine Specification ( 4.9.1 Static Constraints ):

Les contraintes statiques sur le code Java Virtual Machine dans un fichier de classe spécifient comment les instructions Java Virtual Machine doivent être présentées dans le tableau de code et ce que les opérandes de les instructions individuelles doivent être.

Les contraintes statiques sur les instructions du tableau de code sont les suivantes:

  • Le tableau de code ne doit pas être vide, donc l'élément code_length ne peut pas avoir la valeur 0.
  • La valeur de l'élément code_length doit être inférieure à 65536.
  1. À partir de la spécification Java 8 Virtual Machine Specification ( 4.7.3 The Code Attribute ):

La valeur de l'élément code_length donne le nombre d'octets dans le tableau de code pour cette méthode.

La valeur de code_length doit être supérieure à zéro (car le tableau de codes ne doit pas être vide) et inférieure à 65536.

7
Philipp Claßen

Andremoniy a répondu au Java 7 déjà une partie de cette question, mais il semble qu'à cette époque il était bientôt décidé de Java 8 donc je complète la réponse pour couvrir cette partie:

Citant de jvms :

Le fait que end_pc soit exclusif est une erreur historique dans la conception de la machine virtuelle Java: si le code de machine virtuelle Java Virtual Machine pour une méthode est exactement de 65535 octets) long et se termine par une instruction de 1 octet de long, alors cette instruction ne peut pas être protégée par un gestionnaire d'exceptions. Un rédacteur du compilateur peut contourner ce bogue en limitant la taille maximale du Java Virtual Code machine pour n'importe quelle méthode, méthode d'initialisation d'instance ou initialiseur statique (la taille de n'importe quel tableau de codes) à 65 534 octets.

Comme vous le voyez, ce problème historique ne semble pas y remédier au moins dans cette version (Java 8).

1
mok