Ответ 1
Из Блог Никиты Сальникова-Тарновского:
Неглубокая куча проста - она состоит только из кучи, занимаемой сам объект. Есть несколько нюансов о том, как их вычислить, но для объема этой статьи мы оставляем это как есть. Следите за новостями сообщений в той же теме.
Сохраненная куча во многих отношениях более интересна. Только редко вас интересует мелкая куча, в большинстве случаев ваш фактический вопрос можно перевести на "Если я удалю этот объект из памяти, как теперь память теперь может быть освобождена сборщиком мусора".
Теперь, как мы все помним, все алгоритмы сбора мусора Java (GC) следуйте этой логике:
1) Есть некоторые объекты, которые GC считают "важными". Они называются корнями GC и (почти) никогда не отбрасываются. Они есть, например, в настоящее время выполняются методы локальных переменных и ввода параметры, потоки приложений, ссылки на собственный код и аналогичные "глобальные" объекты.
2) Предполагается, что любые объекты, на которые ссылаются эти корни GC и, следовательно, не отбрасывается GC. Один объект может ссылаться на другой в разными способами в Java, в наиболее распространенном случае хранится объект A в поле объекта B. В этом случае мы говорим "B ссылки A".
3) Процесс повторяется до тех пор, пока все объекты, которые могут быть транзитивными полученные от корней GC, посещаются и помечены как "используемые".
4) Все остальное не используется и может быть выброшено.