определение использования памяти Java - PullRequest
5 голосов
/ 24 декабря 2008

Хммм. Есть ли где-нибудь пример использования памяти в Java? Я бы подумал, что у Sun или IBM была бы хорошая статья на эту тему, но я не могу найти ничего, что выглядит действительно солидно. Мне интересно знать две вещи:

  1. во время выполнения, выяснение того, сколько памяти используют классы в моем пакете в данный момент времени
  2. во время разработки, оценивая общие требования к памяти для различных вещей, таких как:
    • сколько дополнительной памяти требуется для пустого объекта (в дополнение к пространству, требуемому его полями)
    • сколько ресурсов памяти требуется при создании замыканий
    • сколько дополнительной памяти требуется для коллекций, таких как ArrayList

Возможно, у меня созданы сотни тысяч объектов, и я хочу быть «хорошим соседом», чтобы не тратить слишком много оперативной памяти. Я имею в виду, что мне все равно, использую ли я на 10% больше памяти, чем «оптимальный случай» (что бы это ни было), но если я реализую что-то, использующее в 5 раз больше памяти, чем я мог бы, если бы сделал простой изменить, я бы хотел использовать меньше памяти (или иметь возможность создавать больше объектов для фиксированного объема доступной памяти).

Я нашел несколько статей ( Информационный бюллетень Java-специалистов и что-то из Javaworld ) и один из встроенных классов java.lang.instrument.getObjectSize () который утверждает, что измеряет «приближение» (??) использования памяти, но все это кажется немного расплывчатым ...

(и да, я понимаю, что JVM, работающая в двух разных ОС, может использовать разные объемы памяти для разных объектов)

Ответы [ 8 ]

4 голосов
/ 25 декабря 2008

Начиная с Java 5, в Hotspot и других виртуальных машинах, которые его поддерживают, вы можете использовать интерфейс Instrumentation для запроса виртуальной машины об использовании памяти данным объектом. Это неудобно, но вы можете сделать это. Если вы хотите попробовать этот метод, я добавил страницу на свой веб-сайт на , запрашивая объем памяти объекта Java с помощью среды Instrumentation.

Как грубое руководство в Hotspot на 32-битных машинах:

  • объекты используют 8 байтов для "Домашнее хозяйство"
  • поля используют то, что вы ожидаете от них использовать, учитывая их битовую длину (хотя логические значения имеют тенденцию выделяться целым байтом)
  • ссылки на объекты используют 4 байта
  • общий размер объекта имеет гранулярность 8 байт (т.е. если вы есть объект с 1 логическим полем он будет использовать 16 байтов; если у вас есть объект с 8 логическими значениями также будет использовать 16 байтов)

В коллекциях нет ничего особенного с точки зрения того, как виртуальная машина обрабатывает их. Их использование памяти является суммой их внутренних полей плюс - если вы считаете это - использование каждого объекта, который они содержат. Вам необходимо учитывать такие вещи, как размер массива по умолчанию для ArrayList и тот факт, что этот размер увеличивается на 1,5 при заполнении списка. Но либо запрос виртуальной машины, либо использование вышеприведенных метрик, просмотр исходного кода для коллекций и «проработка» позволят вам получить ответ.

Если под «замыканием» вы подразумеваете что-то вроде Runnable или Callable, ну, опять же, это просто скучный старый объект, как и любой другой. (NB. Они на самом деле не замыкания !!)

4 голосов
/ 24 декабря 2008

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

3 голосов
/ 24 декабря 2008

Вы можете использовать JMP , но он работает только с Java 1.5.

1 голос
/ 28 декабря 2008

Если вы используете виртуальную машину до 1.5 - вы можете получить приблизительный размер объектов с помощью сериализации. Будьте осторожны, хотя ... для этого объекта может потребоваться удвоенный объем памяти.

1 голос
/ 26 декабря 2008

Я пару раз использовал profiler , который поставляется с более новыми версиями Netbeans и работает очень хорошо, предоставляя вам массу информации об использовании памяти и времени выполнения ваших программ. Определенно хорошее место для начала.

0 голосов
/ 24 декабря 2008

Я полагаю, что профилировщик, включенный в Netbeans, может также контролировать использование памяти, вы можете попробовать это

0 голосов
/ 24 декабря 2008

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

0 голосов
/ 24 декабря 2008

Посмотрите, даст ли PerfAnal то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...