Сборщик мусора - это «задача», которая периодически сканирует ваши объекты, чтобы обнаружить то, что не используется (на самом деле это механизм для эмуляции машины с бесконечной памятью).
По этой причине,когда вы держите ссылку на экземпляр объекта, который вам больше не нужен, вы должны установить для него значение null
, чтобы сборщик мусора знал, что вы больше не заинтересованы в этом экземпляре (и, возможно, его потомках).
Это не означает, что вы должны установить каждую переменную на null
после использования, но вы должны следить за полями.Поскольку Java не имеет шаблона удаления (см. здесь для получения дополнительной информации), вы должны разработать свои API-интерфейсы, чтобы имитировать его: когда вы закончите использовать экземпляр объекта, который содержит ссылку, которую вы хотите освободить, вынеобходимо добавить соответствующий метод для выполнения такого действия.
Рассмотрим следующий пример:
class MyClass1
{
int Field1;
int Field2;
int Field3;
int Field4;
}
class MyClass2
{
private MyClass1 m_MyReference;
public MyClass2()
{
m_MyReference = new MyClass1();
}
public void DoSomething()
{
// do something here that uses m_MyReference.
}
}
Если удерживается экземпляр MyClass2, но какой-то другой достижимый экземпляр вашей программы (например, одиночный)или какой-либо другой экземпляр, который в данный момент находится в стеке), вы никогда не освободите память, связанную с MyClass1, так как на нее все еще ссылается m_MyReference
.
Это плохо?Это зависит от того, что MyClass2 и MyClass1 действительно делают.
Если вы знаете, что MyClass2 может иметь очень большой срок службы, и вы хотите сохранить ссылку на MyClass2, но для освобождения памяти, связанной с MyClass1, вам нужно сделатьчто-то похожее на код ниже:
class MyClass2
{
private MyClass1 m_MyReference;
public MyClass2()
{
m_MyReference = new MyClass1();
}
public void DoSomething()
{
// do something here that uses m_MyReference.
}
public void Dispose()
{
m_MyReference = null;
}
}
Таким образом, вы предоставляете звонящему способ сообщить, что вы больше не держите ссылку на ненужные вам экземпляры.
Помните, чтопросто присвоение null
переменной или полю не приводит к автоматическому освобождению памяти.Сборщик мусора является асинхронным и запускается, когда это решает.Надеюсь, что дал идею, не углубляясь.