saroff
@saroff
Enterprise Java Developer

Как проанализировать использование памяти java — программой?

Застопорился на такой задаче - проанализировать использование памяти java - программой. Методов возвращающих кол-во памяти пожираемой объект в java нет. Анализировать же извне тоже сложно - ведь там мы видим еще и память занимаемую JVM. С помощью чего можно проанализировать, сколько та или иная программа потребляет памяти в чистом виде, не беря во внимание JVM и тд? Наверняка же уже придумано что-то для этой цели. (Самостоятельный подсчет не предлагать)
  • Вопрос задан
  • 3974 просмотра
Пригласить эксперта
Ответы на вопрос 3
@vlastachu
Можете воспользоваться логом для сборщика мусора.
java -Xloggc:<файл для вывода лога> -XX:+PrintGCDetails -XX:+PrintGCDateStamps <ваша программа с флагами>


На разных JVM флаги и формат вывода разный.
Вот что вы скорее всего увидете.
[GC 245118K->214677K(1571712K) eden 30464K->0K survivor 247K->270K tenured 214406K->214406K, 0.0212236 secs]
[GC 245141K->214708K(1571712K) eden 30463K->0K survivor 270K->301K tenured 214406K->214406K, 0.0229019 secs]
[GC 245172K->214692K(1571712K) eden 30463K->0K survivor 301K->285K tenured 214406K->214406K, 0.0241589 secs]
[GC 245156K->214747K(1571712K) eden 30463K->0K survivor 285K->340K tenured 214406K->214406K, 0.0245928 secs]

Здесь используется сборщик мусора с тремя кучами (три поколения) eden, survivor и tenured.
У каждого из них есть характеристики сколько бы до сборки и сколько осталось после (eden 30463K->0K).
В начале есть общая характеристика которая вас наверное и интересует. В ней также указан объем памяти занимаемый объектами до сборки и после сборки, а также в скобках указан общий объём кучи. Кроме этих поколений есть также и permanent generation, где хранится информация о классах и статические поля. Во многих моментах я могу ошибаться, но надеюсь я помог с направлением поиска.
Ещё есть GCViewer - визуализирует состояние сборщика и собирает общую статистику.
Если вы найдёте какую-нибудь документацию по формату лога сборщика - поделитесь ссылкой. Был бы благодарен.
Ответ написан
Losted
@Losted
Software Architect
Может не совсем верно понимаю вопрос, но чем профайлеры-то не подходят?
Ответ написан
@Power
Сведения о памяти можно ещё с помощью jstat смотреть. Это такая консольная утилита, которая позволяет подключиться к любому запущенному java-процессу (только запускать её обязательно от имени того же пользователя, от которого java запущена).
Эти же сведения умеют показывать всякие графические visualvm и jconsole.
Но то, что вы там увидите, - это потребеление, в которое входят в том числе объекты самой JVM и несобранный мусор.
А чтобы смотреть подробности и "чистое" потребление, нужен профилировщик (visualvm и jconsole это тоже умеют).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы