Как я могу рассчитать, сколько оперативной памяти использует объект? - PullRequest
0 голосов
/ 17 марта 2011

У меня есть HashMap, который содержит 12 миллионов записей. Он отображает String значения на Long значения. Каждая строка длиной около десяти символов. Можно ли рассчитать, сколько памяти понадобится этой карте в оперативной памяти?

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Вы можете догадаться, и вы можете сделать обоснованное предположение, посмотрев на размер каждого элемента, который входит в карту, но ваше лучшее образованное предположение будет неверным.

JVM имеют другую структуру, используемую для отслеживания ссылок и хранения информации о типах для классов. Это добавит фиксированный, но пока неизвестный объем памяти к точной (если вы можете получить точную оценку входных данных) оценке.

Поскольку только часть памяти является памятью, непосредственно хранящей данные, а часть памяти является памятью, используемой в качестве служебной информации для хранения данных, вам необходимо профилировать потребление памяти и основывать свои оценки на прогнозах роста памяти. при использовании меньших карт.

Обратите внимание, что профилирование JVM является сложной задачей, поскольку оно оптимизирует использование памяти способом, который будет давать различные результаты в зависимости от того, как долго работает JVM, активности карты и т. Д. Вам необходимо выполнить статистическую выборку. ввода в различных условиях; но, шансы хорошие, вы в конечном итоге сможете поставить разумное число. Что еще более важно, вы также сможете сказать: «Ну, это может временно увеличиться примерно до этого числа, но в среднем должно быть доведено до этого». Временные изменения в памяти часто игнорируются при статическом анализе.

0 голосов
/ 17 марта 2011

Профилировщик скажет вам, сколько памяти используется программой, и какие объекты что используют.Возможно, вы сможете найти использование памяти вашими объектами.

VisualVM включен в Java6 и предоставит вам эту информацию.

Стоит отметить, что это не обязательно дастВы - требование к памяти, просто представление о том, сколько памяти она использует в тот момент.

0 голосов
/ 17 марта 2011

JVM будет знать, потому что она должна распределять и управлять памятью, но она не говорит вам. Итак, если не считать родной, нет, невозможно узнать, сколько памяти фактически используется вашими объектами.

...