Как контролировать использование памяти Java? - PullRequest
57 голосов
/ 29 июня 2009

У нас есть приложение j2ee, работающее на Jboss, и мы хотим отслеживать использование его памяти. В настоящее время мы используем следующий код

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

Этот код работает нормально. Это означает, что он показывает кривую памяти, которая соответствует действительности. Когда мы создаем большой файл XML из БД, кривая идет вверх, а после завершения извлечения она идет вниз.

alt text

Консультант сказал нам, что явно вызывать gc () неправильно, «пусть jvm решает, когда запускать gc». В основном его аргументы были такими же, как здесь обсуждалось . Но я все еще не понимаю:

  • как мне получить кривую использования памяти?
  • что не так с явным gc ()? Меня не волнуют небольшие проблемы с производительностью, которые могут возникнуть с явным gc () и которые я бы оценил в 1-3%. Мне нужен монитор памяти и потоков, который помогает мне анализировать нашу систему на сайте заказчика.

Ответы [ 13 ]

2 голосов
/ 29 июня 2009

Если вы используете Java 1.5, вы можете посмотреть на ManagementFactory.getMemoryMXBean (), который дает вам цифры на все виды памяти. куча и не куча, пермь.

Хороший пример можно найти там http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space

0 голосов
/ 30 июня 2009

Проблема с system.gc заключается в том, что JVM уже автоматически выделяет время сборщику мусора на основе использования памяти.

Однако, если вы, например, работаете в условиях очень ограниченного объема памяти, таких как мобильное устройство, System.gc позволяет вам вручную выделять больше времени на эту сборку мусора, но за счет времени процессора (но, как вы сказали, вас не очень беспокоит проблема производительности gc).

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

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

0 голосов
/ 29 июня 2009

Как уже было предложено, попробуйте VisualVM, чтобы получить базовый вид.

Вы также можете использовать Eclipse MAT для более детального анализа памяти.

Это нормально делать System.gc (), если вы не зависите от него, для правильности вашей программы.

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