Какое максимальное количество параметров может иметь метод в Java и почему?
Я использую Java 1.8 в 64-битной системе Windows.
Во всех ответах на StackOverflow об этом говорится, что технический предел составляет 255 параметров без указания причин.
Чтобы быть точным, 255 для статических и 254 для нестатических ( this
будет 255-м в данном случае) методов.
Я подумал, что это можно описать в какой-то спецификации, и что существует просто статически определенное максимальное количество разрешенных параметров.
Но это было справедливо только для int
всех 4-байтовых типов . Я провел несколько тестов с long
параметрами, и в этом случае я смог объявить только 127 параметров.
С участием String
параметрами допустимое число, которое я вывел из тестирования, составляет 255 (это может быть потому, что эталонный размер в Java составляет 4 байта?).
Но поскольку я использую 64-битную систему, размер ссылок должен составлять 8 байт, и поэтому с String
параметрами максимально допустимое число должно быть 127, аналогично long
типам.
Как именно применяется этот лимит?
Имеет ли ограничение какое-либо отношение к размеру стека метода?
Примечание: на самом деле я не собираюсь использовать эти многие параметры в каком-либо методе, но этот вопрос предназначен только для уточнения точного поведения.
<= 4
. Что-то еще, вероятно, должно быть заключено в объект.Ответы:
Этот предел определен в спецификации JVM :
Раздел 4.3.3 дает некоторую дополнительную информацию:
Ваши наблюдения были замечены, примитивы двойных слов (
long
/double
) нужно вдвое больше обычных 4-байтовых переменных и 4-байтовых ссылок на экземпляры объектов .Что касается последней части вашего вопроса, относящейся к 64-битным системам, спецификация определяет, сколько единиц вносит параметр , эта часть спецификации должна быть соблюдена даже на 64-битной платформе, 64-битная JVM будет содержать 255 параметров экземпляра (например, ваш 255
Strings
) независимо от размера указателя внутреннего объекта.источник
long
иdouble
независимо от системной архитектуры происходит во многих местах спецификации и кажется остатком 32-битной эры.Раздел 4.3.3 спецификации JVM содержит информацию, которую вы ищете:
Следовательно, похоже, что 32-битный или 64-битный хост-компьютер не влияет на количество параметров. Если вы заметили, в документации используются «единицы», где длина одной «единицы» зависит от размера слова. Если количество параметров прямо пропорционально размеру слова, возникнут проблемы с переносимостью; вы не сможете скомпилировать одну и ту же программу Java на разных архитектурах (при условии, что хотя бы один метод использовал максимальное количество параметров в архитектуре с большим размером слова).
источник
Я нашел интересную проблему в информационном бюллетене об этом, http://www.javaspecialists.eu/archive/Issue059.html
источник