77 votes

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

Je sais qu'une méthode ne peut pas être plus grande que 64 Ko avec Java. Cette limitation nous pose des problèmes avec le code généré à partir d'un fichier JavaCC grammaire. Nous avons eu des problèmes avec Java 6 et nous avons pu les résoudre en modifiant la grammaire. Celle-ci a-t-elle été modifiée pour Java 7 ou est-elle prévue pour Java 8 ?

Juste pour que ce soit clair. Je n'ai pas besoin d'une méthode plus grande que 64 KB par moi-même. Mais j'ai écrit une grammaire qui compile vers une méthode très grande.

58voto

Andremoniy Points 7349

Selon JVMS7 :

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

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

11voto

Anders R. Bystrup Points 7500

Bonne question. Comme toujours, nous devrions aller à la source pour trouver la réponse ( "La spécification de la machine virtuelle Java®" ). La section ne mentionne toutefois pas explicitement de limite (comme le faisait la spécification Java6 VM), mais de manière quelque peu circonspecte :

Le nombre maximal de variables locales dans le tableau des variables locales d'un cadre créé lors de l'invocation 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 méthode, et par l'indexation des variables locales sur 16 bits du jeu d'instructions de la machine virtuelle Java.

A la vôtre,

1voto

mok Points 3059

Andremoniy a répondu à la question java 7 partie de cette question déjà, mais il semble qu'à l'époque, il fallait bientôt décider sur java 8 donc je complète la réponse pour couvrir cette partie :

Citation 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 la machine virtuelle Java pour une méthode fait exactement 65535 octets et se termine par une instruction de 1 octet, cette instruction ne peut pas être protégée par un gestionnaire d'exception. L'auteur d'un compilateur peut contourner ce bogue en limitant la taille maximale du code généré par la machine virtuelle Java pour toute méthode, méthode d'initialisation d'instance ou initialisateur statique (la taille de tout tableau de code) à 65534 octets.

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

-1voto

ombud Points 76

Comme solution de rechange, et si si vous avez accès au code de l'analyseur, vous pouvez le modifier pour qu'il fonctionne dans les limites imposées par le compilateur de la JVM... (En supposant que cela ne prenne pas une éternité pour trouver les portions du code de l'analyseur à modifier).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X