Java garbage collector и как он знает, какие объекты нужно освободить из памяти

#java #garbage-collection

#java #сборка мусора

Вопрос:

Я читал из нескольких источников, что Java garbage collector освобождает память от объектов, которые не используются. Мой вопрос в том, как он узнает, что он не используется? Правильно ли я говорю, что если бы я инициализировал некоторый массив, и на этот массив никогда не ссылались, не использовали или не изменяли, что пространство в памяти для этой переменной было бы освобождено?

Спасибо

Комментарии:

1. Это зависит от того, где вы инициализировали свой массив. Например: в методе, после завершения работы метода, ваш объект будет иметь право на очистку с помощью GC. В противном случае, чтобы сделать объект приемлемым, вы должны присвоить ему значение null.

2.Я уверен, что вы этого не читали 🙂chaoticjava.com/posts/how-does-garbage-collection-work ibm.com/developerworks/library/j-jtp10283

Ответ №1:

тогда это будет кандидат для сбора сборщиком мусора. если нет ссылки на этот объект, это будет кандидат. Когда он будет собран, это зависит от стратегии GC.

Ответ №2:

Сборщик мусора освобождает память только тогда, когда это необходимо. Таким образом, нет никакой гарантии, что он когда-либо будет освобожден.

Любой объект, который недоступен из стеков потоков через жесткую ссылку, может быть освобожден.

Ответ №3:

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

В вашем случае массив будет кандидатом на сборку данных, когда JVM определяет, что ему требуется память, она запускает сборку данных, обычно это происходит, когда доступная память составляет 15% от общей памяти, это то, что я наблюдал на IBM JVM, но не всегда верно.

Ответ №4:

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

приведенный вами пример для массива будет удален из памяти, только если в вашей программе вообще нет ссылок или у нее закончились все ссылки на саму себя после их выполнения, но вы не можете быть уверены, когда эта память будет освобождена…

вы можете думать о сборщике мусора как о ленивом парне …. но зачем винить его, в конце концов, он выполняет всю грязную работу по очистке 😉