Вы никогда не должны звонить System.gc.Система вызовет его, когда будет мало памяти.
В Java GC работает в системе под названием Mark and Sweep.Алгоритм работает следующим образом:
- Начните с набора корневых объектов (корней GC) и набора всех выделенных объектов.
- Отметьте эти корни
- Отметьтекаждый объект, достижимый из этих корней, путем рекурсивного посещения каждого поля этих объектов.
- Когда каждый возможный объект помечен, просмотрите список всех объектов.Если элемент не помечен, освободите его.
(Это упрощение, современная реализация работает примерно так, но гораздо более изощренно).
Так что же такоекорень GC?Любой объект, сохраненный в локальной переменной, все еще находящейся в области видимости, в статической переменной, в ссылке JNI и во всех выполняющихся в данный момент потоках.
Так что нет, поток не будет очищен, если он не завершит работу,Вот почему потоки так легко создают утечку памяти - до тех пор, пока они работают, любой объект, на который они ссылаются, не может быть освобожден, потому что корень GC (поток) имеет ссылку на него.
Но отношения всегдаспускается от корня к другим объектам.Если Foo содержит ссылку на Bar, Foo может быть удалена независимо от того, может ли быть Bar.Но если Foo не может быть удален, то и Бар не может.