Почему утечка памяти из Intellij Heap в Hello World с Thread.Sleep?
Я заметил, что использование памяти кучи увеличивается в других программах, поэтому я сделал эту простую программу, чтобы увидеть, сообщает ли JConsole то же самое в простом приложении HelloWorld. Я добавил Thread.sleep() в цикл, чтобы сохранить приложение для тестирования.
Каков источник этой проблемы? Должен ли я быть обеспокоен?
Эта диаграмма показывает мои настройки тестирования:
Вот код, который я использую для тестирования:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
while(true)
{
try {
System.out.print("Sleeping...");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Working");
}
}
}
Эта диаграмма показывает, что куча памяти удваивается в течение 15 минут:
Через 25 минут я увидел исправленную память, но та же утечка продолжилась оттуда:
Это просто интеллигент ведет себя? Достаточно ли восстановленной памяти, чтобы сказать, что это не утечка?
Примечание: система MacOS High Sierra на MacBook Pro 2,8 ГГц, 16 ГБ. IntelliJ Ultimate 2018.2.
1 ответ
Как предположил Джейкоб, это совершенно нормально.
Как предположил Питер, я тестировал с Java Mission Control и проверял, что куча памяти после последовательных сборок мусора была достаточно стабильной (было бы неплохо, если бы я мог навести курсор на эти минимумы, чтобы получить точные значения).
Я по-прежнему обеспокоен тем, что такая маленькая тестовая программа выделяет 140 МБ на регулярной основе. Я бы ожидал чего-то гораздо более низкого.
Вот скриншот JMC с выводами: