2014-11-19 5 views
1

Я читал что-то в Интернете, но я не уверен, что получаю его.Объяснение работы памяти кучи (Java)

Я создал небольшой веб-сайт, на котором размещается дешевый сервер с памятью памяти объемом 128 МБ. Когда я запустить сервер и я посетить первую страницу У меня есть эти значения (я их с помощью Runtime.getRuntime().totalMemory() и Runtime.getRuntime().freeMemory()):

  1. общая память: 128974848
  2. Используемая память: 42376200
  3. свободной памяти: 86598648

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

Я не могу понять, если это так, как ведет себя память кучи или что-то не так в моем коде.

+0

* общая * память уменьшается; вы имеете в виду * бесплатную память? –

+0

Я имею в виду общую память !!! Вот почему я спрашиваю, есть ли проблемы в соответствии с вами. – MDP

+0

Как вы измеряете эти цифры? –

ответ

0

Это довольно нормально. Различные веб-страницы будут использовать разные объемы памяти на основе содержимого, которое у них есть. Там, где я был бы обеспокоен, если вы продолжаете открывать страницы, и память никогда не освобождается. Это memory leak и вызывает беспокойство, если вы разрабатываете веб-браузеры.

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

+0

Это не обязательно утечка памяти. Процесс может зависеть от совершенной памяти из-за удобства. Использование памяти (если смотреть с точки зрения ОС) сложно. –

+0

А, правда.Я добавлю это. –

+0

Затем, в соответствии с тем, что вы говорите, возможно, в моем коде отсутствует ошибка, когда я вижу уменьшение Runtime.getRuntime(). TotalMemory(), но это всего лишь поведение памяти кучи? Правильно? – MDP

2

Я не могу понять, если это так, как память кучи ведет себя

Да, это суть того, как любая система сборки мусора на основе будет вести себя.

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

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

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

+0

Как это объясняет 'totalMemory' уменьшение? (В отличие от 'freeMemory', например.) –

+0

Благодарим вас за объяснение, но что неясно, это уменьшение общей памяти. – MDP

Смежные вопросы