Сколько памяти выделит JVM для 1) Статической строки 2) Статического целого числа
(Чтобы упростить ситуацию, я предполагаю, что речь идет о 32-битной JVM. Также обратите внимание, чтоэти числа приблизительные и специфичные для JVM .)
Простая первая - каждая статическая переменная Integer
занимает 4 байта памяти для ссылки плюс 4 байта+ 1 заголовок объекта (обычно 8 байтов IIRC).Итого - 16 байтов.
(И если вы говорите о статических int
переменных, то это всего 4 байта на int
.)
Статическая переменная String
представляет собойнемного сложнее ... и дороже:
- Статическая ссылочная переменная составляет 4 байта.
- Объект
String
имеет 4 поля по 4 байта + заголовок объекта 1 x 2 слова: это 24 байта. - Одно из этих полей относится к массиву char, который имеет заголовок из 3 слов итребует
(string.length() + 3) / 4
байтов для содержимого - это 12 + несколько кратных 4 байтам. - Если значение String является константой времени компиляции, то строка будет интернирована, и это добавит несколько дополнительных байтов длязапись хеш-таблицы пула строк.(32 байта было бы разумным предположением.)
Добавьте все это, и вы получите (скажем) 80+ байтов на строку, в зависимости от длины строки.Но почти все эти байты являются представлением самой (интернированной) строки.Только 4 байта из-за использования static
.
Я исследую эту проблему, так как получаю исключение кучи памяти из памяти, в моем приложении 8 файлов констант и каждый файлимеет почти 300 статических констант.
Это незначительно.OOME почти наверняка вызвано чем-то другим.
Является ли хорошей практикой объявление всех констант как статических или любой другой практики, которой я могу следовать?
ЭтоРекомендуется объявлять реальные константы статическими, вплоть до некоторой точки.
Однако большое количество констант в исходном коде становится громоздким, и в конечном итоге вы сталкиваетесь с ошибками компиляции из-за ограничений в формате байт-кодафайл.В этот момент (и, вероятно, задолго до этого) вы должны переместить константы из вашего исходного кода в базу данных или файл конфигурации.
Скорее всего, вы столкнетесь с ограничением в формате байт-кода задолго до памятииспользование становится серьезной проблемой.