2016-08-08 3 views
0

У меня есть некоторые объекты внутри хэш-карты. Эти объекты содержат bytebuffer's. Теперь я хочу, чтобы эти байтовые буферы были освобождены. Поэтому для этого, если я просто сделаю ссылку hashmap ссылкой null, она позволит всем этим объектам, готовым собирать мусор, и освободить буфер. или мне нужно сделать все эти null явно.Как включить объекты для сбора мусора?

+0

Как правило, не требуется извлечение объекта из вашего кода для сбора мусора. Таким образом, этого должно быть достаточно, чтобы сделать ссылку hashmap нулевой, чтобы все элементы были освобождены. –

ответ

0

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

1

По существу, это сводится к достижимости. Если объект не может быть достигнут через цепочку (нормальные) ссылки, начиная с чего-то, что у вас есть в коде (a -> b -> c, где у вас есть), тогда он имеет право на GC. Если можно, то это не так. Если ничего больше не ссылается на ваш объект, байтбуфер имеет право на GC, потому что он не может быть достигнут.

У меня есть некоторые объекты внутри хэш-карты.

Я собираюсь предположить, что они являются значениями, а не ключами. (Это имеет значение только с точки зрения удаления ли запись из HashMap или просто установить значение ключа для null.)

Так что, если я просто сделать эталонную HashMap нуль это будет включить все эти объекты готовый к сборке мусора и освобождение буфера. или мне нужно сделать все эти null явно.

Вы просто должны освободить свой объект, например, удалить запись из HashMap полностью, или установить значение параметра в null, который выпустит ссылку HashMap «s на ваш объект. Если это единственная ссылка на ваш объект, ваш объект становится подходящим для GC; если ваш объект является единственной вещью со ссылкой на байтовое устройство, то он также становится приемлемым для GC. Вам не нужно явно указывать ссылку на байтовый буфер в вашем объекте.

код стоит 1024 слов, так:

class Thingy { 
    private byte[] buffer; 

    MyObject() { 
     this.buffer = new byte[1024]; 
    } 
} 

В другом месте:

Map<String, Thingy> m = new HashMap<>(); 

m.put("foo", new Thingy()); 
// At this point, the HashMap refers to the Thingy, and the Thingy refers to the 
// buffer, so neither of them is eligible for GC 

m.remove("foo"); // or m.put("foo", null) if that's really appropriate 
// At this point, nothing refers to the Thingy anymore, and so both the Thingy and 
// its buffer are eligible for GC 

Java имеет концепцию weak references, которые являются исключением из этого правила. Они позволяют объекту быть GC'd, даже если объект можно извлечь из содержащего их WeakReference (с этого момента он не может быть достигнут через этот WeakReference).

+0

вы должны упомянуть о концепции корней GC. анализ путей на графике имеет смысл только в том случае, если у вас есть исходная точка – the8472

0

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

Мои мысли:

Если я называю: MyMap = NULL; Что происходит с соответствующими ключами Hashmap или значениями объектов внутри карты? Будут ли они собирать мусор, или мне нужно установить null все связанные объекты внутри объекта myMap?

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

  • Ничего не происходит сразу.
  • Если эти ключи и значения доступны только по карте, то они теперь недоступны и имеют право на сбор мусора. (В этом случае ненулевое назначение ссылок на внутренние объекты необязательно.)
  • Однако, если внутренние узлы достижимы с помощью других путей, они, по-видимому, еще доступны и, следовательно, НЕ пригодны для сбора мусора. и если вы сделаете карту нулевым, это не будет собирать мусор.