производительность памяти Java - странное поведение (или это нормально?) - PullRequest
5 голосов
/ 06 июня 2011

Привет, я хотел бы начать с того, что я начинающий, но я работаю над очень маленьким и простым Java-приложением, которое действительно не должно вызывать серьезных проблем.Я отслеживал использование памяти из диспетчера задач Windows и заметил, что при запуске приложения java.exe использовал около 70 МБ доступной памяти.Так что я подумал про себя, хорошо, это, вероятно, немного больше, но все же, ничего, с чем мой ПК не мог справиться.Но действительно странная вещь начала происходить, когда я попытался изменить размер моего окна, использование памяти внезапно возросло до 80-90 МБ, и если я продолжу перетаскивать свое окно, изменяя размер случайным образом, это продолжало увеличивать использование памяти.Я подумал, что это как-то связано с вызовом методов перерисовки компонентов GUI во время изменения размера окна, поэтому я взял несколько подозрительных компонентов, которые могут вызвать некоторую утечку памяти, и удалил их из формы основного окна, в результате чего моя программа была почти полностью урезана,но эта проблема сохранилась.Позже я заметил, что если я продолжу изменять размеры своего окна, использование памяти возрастет до 200-220 МБ, а затем остановит этот неконтролируемый рост.Так может кто-нибудь сказать мне, может ли это быть нормальным поведением, имея в виду управление памятью в Java?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Созданные объекты Java не обязательно очищаются после завершения работы с ними. Вместо этого что-то, называемое «сборщик мусора», периодически запускается в фоновом режиме в поисках потерянных объектов и удаляет их, освобождая память.

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

Вы, вероятно, обнаружите, что ваша максимальная память составляет 256 МБ (по умолчанию) - сборщик мусора, вероятно, вызывается чаще, когда вы приближаетесь к максимальной памяти, а создание новых объектов требует немедленного освобождения памяти - отсюда Память колеблется чуть меньше 256 МБ, поскольку скорость создания / удаления сбалансирована по требованию.

Это совершенно нормальное поведение.

2 голосов
/ 06 июня 2011

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

Таким образом, JVM будет стремиться использовать большую часть памяти, которую ему разрешено использовать (максимальный размер кучи) - и на современном ПК с несколькими доступными ГБ памяти максимальный размер кучи по умолчанию будет довольно большим. Однако, если у вас небольшое приложение, которое, как вы знаете, не будет нуждаться в большом объеме памяти, вы можете настроить максимальный размер кучи с помощью параметра командной строки -Xmx, например

java -Xmx64M main.class.name

ограничит кучу до 64 МБ

...