Hacemos una verificación exhaustiva cada una de las reseñas en nuestra web con la meta de enseñarte en todo momento la información más veraz y actualizada.
Solución:
Ese límite se define en la especificación JVM:
El número de parámetros del método. está limitado a 255 por la definición de un descriptor de método (§4.3.3), donde el límite incluye una unidad para este en el caso de invocaciones de métodos de instancia o interfaz.
La sección §4.3.3 brinda información adicional:
Un descriptor de método es válido solo si representa parámetros de método con una longitud total de 255 o menos, donde esa longitud incluye la contribución para este en el caso de invocaciones de métodos de instancia o interfaz.
La longitud total se calcula sumando las contribuciones de los parámetros individuales, donde un parámetro de tipo long o double aporta dos unidades a la longitud y un parámetro de cualquier otro tipo aporta una unidad.
Sus observaciones fueron acertadas, primitivas de doble palabra (long
/double
) necesita el doble del tamaño de las variables habituales de 4 bytes y referencias de instancia de objeto de 4 bytes.
Con respecto a la última parte de su pregunta relacionada con los sistemas de 64 bits, la especificación define cuántos unidades que contribuye un parámetroesa parte de la especificación todavía debe cumplirse incluso en una plataforma de 64 bits, la JVM de 64 bits aceptará parámetros de 255 instancias (como su 255 Strings
) independientemente del tamaño del puntero del objeto interno.
La sección 4.3.3 de la especificación JVM tiene la información que está buscando:
Un descriptor de método es válido solo si representa parámetros de método con una longitud total de 255 o menos, donde esa longitud incluye la contribución para esto en el caso de invocaciones de método de instancia o interfaz. La longitud total se calcula sumando las contribuciones de los parámetros individuales, donde un parámetro detipo largo o doble aporta dos unidadesa la longitud y unparámetro de cualquier otro tipo contribuye una unidad.
Por lo tanto, parece que el hecho de que la máquina host sea de 32 bits o de 64 bits no tiene ningún efecto sobre el número de parámetros. Si nota, la documentación habla en términos de “unidades”, donde la longitud de una “unidad” es una función del tamaño de la palabra. Si el número de parámetros es directamente proporcional al tamaño de la palabra, habría problemas de portabilidad; no podría compilar el mismo programa Java en diferentes arquitecturas (asumiendo que al menos un método usó la cantidad máxima de parámetros en la arquitectura con el tamaño de palabra más grande).
Encontré un tema interesante de un boletín sobre esto, http://www.javaspecialists.eu/archive/Issue059.html
El grupo de constantes por clase o por interfaz está limitado a 65535 entradas por el campo constant_pool_count de 16 bits de la estructura ClassFile. Esto actúa como un límite interno sobre la complejidad total de una sola clase o interfaz. La cantidad de código por método no abstracto no nativo está limitada a 65536 bytes por los tamaños de los índices en la tabla de excepciones del Código attributeen LineNumberTable attributey en la tabla de variables locales attribute.
El mayor número de variables locales en las variables locales array de un marco creado al invocar un método está limitado a 65535 por el tamaño del elemento max_locals del Código attribute dando el código del método. Tenga en cuenta que se considera que los valores de tipo long y double reservan dos variables locales y contribuyen con dos unidades al valor max_locals, por lo que el uso de variables locales de esos tipos reduce aún más este límite.
El número de campos que puede declarar una clase o interfaz está limitado a 65535 por el tamaño del elemento de recuento de campos de la estructura ClassFile. Tenga en cuenta que el valor del elemento de recuento de campos de la estructura ClassFile no incluye campos heredados de superclases o superinterfaces.
Calificaciones y comentarios
Si crees que te ha sido útil este post, sería de mucha ayuda si lo compartieras con otros entusiastas de la programación de esta manera contrubuyes a dar difusión a este contenido.