Утечки памяти в назначении Java - PullRequest
6 голосов
/ 04 октября 2011

Я должен предположить, что следующий метод не пропускает память:

public final void setData(final Integer p_iData)
{
    data = p_iData;
}

, где data - это свойство некоторого класса.new Integer заменяет существующую ссылку data. Так что же происходит с текущими / старыми данными?

Java должна что-то делать внутри;в противном случае нам пришлось бы обнулять любые объекты каждый раз, когда объект назначается.

Ответы [ 7 ]

7 голосов
/ 04 октября 2011

Упрощенное объяснение:

Периодически сборщик мусора просматривает все объекты в системе и обнаруживает, что они больше недоступны из живых ссылок.Он освобождает любые объекты, которые более недоступны.

Обратите внимание, что ваш метод не создает новый Integer объект вообще.Например, ссылку на один и тот же объект Integer можно передавать снова и снова.

Реальность сборки мусора намного сложнее, чем эта:

  • ModernGC имеют тенденцию быть поколенческими , предполагая, что большинство объектов недолговечны, поэтому нет необходимости проверять всю (возможно большую) кучу так часто;он может просто проверять «недавние» объекты на жизнеспособность часто
  • У объектов могут быть финализаторы - код, запускаемый перед сборкой мусора.Это задерживает сборку мусора таких объектов циклом, и объект может даже «воскресить» себя, сделав себя достижимым
  • Современные GC могут собирать параллельно и иметь многочисленные варианты настройки
3 голосов
/ 04 октября 2011

Java - это язык для сбора мусора.

Если больше нет живых ссылок на объект, он становится пригодным для сборки мусора. Коллектор запускается время от времени и восстанавливает память объекта.

В двух словах, ваш код на 100% правильный и не пропускает память.

0 голосов
/ 04 октября 2011

Я хочу показать вам один пример в некотором коде:

int x;
x=10;
x=20;

Первоначально я назначил от x до 10 снова, от x до 20, первая эталонная память будет обрабатываться Java GC.Java GC - это поток, который выполняется непрерывно, проверяет несвязанную память и очищает ее.

0 голосов
/ 04 октября 2011

Если на объект, на который ранее ссылались данные, больше не ссылается ни одна структура объекта, на которую ссылается какой-либо работающий поток, он имеет право на сбор мусора.GC выполняется Java в фоновом режиме для освобождения памяти от неиспользуемых объектов.

0 голосов
/ 04 октября 2011

На самом деле, поскольку Integer является объектом, а не примитивным типом, строка:

data = p_iData;

обновляет ссылку.

Теперь старый объект, на который this.data указывал, будет проверен GC, чтобы определить, нет ли больше ссылок на этот объект. Если нет, то этот объект уничтожается и память освобождается (через некоторое время)

0 голосов
/ 04 октября 2011

если нет ссылки на data, сборщик мусора java очистит старые данные и освободит память

0 голосов
/ 04 октября 2011

В конце концов он получает мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...