Как профилировать память JVM в коде? - PullRequest
2 голосов
/ 18 марта 2011

Я пишу сервлет, который не могу протестировать в Eclipse, мне нужно работать на сервере.Я хочу сделать профилирование памяти и точно определить любые утечки.Итак, я думаю, что мне нужно написать отладочные операторы, которые могут сказать мне текущее использование памяти.Может кто-нибудь указать мне хорошие рекомендации о том, как это сделать и / или какие классы в JDK делают это?

Обратите внимание, что я не могу использовать "Eclipse MAT".

Ответы [ 5 ]

5 голосов
/ 18 марта 2011

Не можете ли вы использовать встроенный инструмент в JDK jvisualvm ?

1 голос
/ 18 июня 2014

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

Я думаю, что вы, как и я, предпочитаете профилировать в коде вместо использования внешнего инструмента профилирования, такого как JVisualVM или JConsole.

Вы можете использовать инструмент под названием MemorySampler (написанный мной) из CoralBits , который точно скажет в какой строке вашей кодовой памяти выделяется, Ниже приведен пример:

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
MemorySampler.start();
for(int i = 0; i < strings.length; i++) queue.offer(strings[i]);
for(int i = 0; i < strings.length; i++) queue.poll();
MemorySampler.end();
if (MemorySampler.wasMemoryAllocated()) MemorySampler.printSituation();

Дает вам следующий вывод:

Memory allocated on last pass: 24576
Memory allocated total: 24576

Stack Trace:
    java.util.concurrent.ConcurrentLinkedQueue.offer(ConcurrentLinkedQueue.java:327)
    TestGC.main(TestGC2.java:25)

Теперь, если вы перейдете к строке 327 исходного кода ConcurrentLinkedQueue, вы увидите, что он выделяет экземпляр Node там.

Отказ от ответственности: Я один из разработчиков CoralBits.

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

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

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

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

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

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

Для этого взгляните напредлагаемые инструменты (JVisualVM, JConsole).

Если вы все еще хотите получать информацию об использовании памяти из вашей программы, попробуйте классы в пакете java.lang.management ;

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

JConsole чтобы спасти вас!

...