Итак, я думаю, что мне нужно написать отладочные операторы, которые могут сообщить мне текущий
использование памяти.
Я думаю, что вы, как и я, предпочитаете профилировать в коде вместо использования внешнего инструмента профилирования, такого как 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.