Android сборщик мусора работает на главной теме? - PullRequest
0 голосов
/ 17 сентября 2018

Пример: Предположим, в идеале, что объект является сборщиком мусора (активность изменила ориентацию и сильная ссылка на объект потерян), но еще не утилизирован. Таким образом, строка 2 вернет истину. Есть ли способ, которым объект удаляется, пока выполнение находится в строке 3? Или это ждать, пока не закончится?

new Thread {

       WeakReference item= new WeakReference(object);

       void method(){
2      if(item.get()!=null)
3          item.get().getName();
      }
}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Прежде всего сборщик мусора не работает на том, что вы считаете основным потоком вашего процесса.Если посмотреть с точки зрения операционной системы, GC может работать в основном потоке виртуальной машины, на которой выполняется ваше приложение.Или он может работать в новом потоке.

Но с точки зрения Java, GC не работает ни в одном из потоков вашего приложения.Поток, выполняющий GC, не является ни вашим основным потоком Java, ни доступным вам потоком Java.

С точки зрения вашего кода Java основной поток и все остальные потоки останавливаются (удаляются из планировщика), пока выполняется GC,Это не всегда правда, хотя.Но это зависит от реализации виртуальной машины.Но вы всегда должны предполагать, что все ваши потоки Java, включая основной поток, остановлены во время работы GC.

Итак, чтобы точно ответить на ваш вопрос, **

Да, ваша недельная ссылкаможет стать нулевым во второй строке.

**

Ваш код может получить исключение NullPointerException в строке три.

Поскольку строки 2 и 3 являются двумя отдельнымиантомные операции.Возможно, что GC может активировать после выполнения строки 2, остановить выполнение всех ваших потоков, выполнить сборку мусора, а затем возобновить все ваши потоки, вызывая исключение NullPointerException в строке 3.

0 голосов
/ 17 сентября 2018

Если у вас есть сильная ссылка на объект, то этот объект не подходит для GC.

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

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

Неправильное использование - объект может быть собран между нулевой проверкой и getName вызовом

if(item.get()!=null)
   item.get().getName();

Правильное использование - сильная ссылка для дальнейшей обработки

Object object = item.get();
if(object!=null)
   object.getName();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...