1

У меня есть фрагмент, который содержит ссылку на родительскую активность. В методе onCreateView я инициализирую адаптер, передав статический список адаптеру. Поскольку список является «статическим», означает ли это, что Activity, Fragment и Adapter никогда не будут собирать мусор?Утечка памяти Android и сборка мусора

Вот мой код - не

public class MyFragment extends Fragment 
{ 
RecyclerView rvMyContestLists; 
MyContestListAdapter adapter = null; 
Activity activity; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
     // CConstantVariables.listMyContestData is static 
     adapter = new MyContestListAdapter(activity, CConstantVariables.listMyContestData); 
     rvMyContestLists.setAdapter(adapter); 
     rvMyContestLists.setLayoutManager(new LinearLayoutManager(getActivity())); 
} 
} 

означает, что активность будет никогда сборщик мусора ли использовать «статическую» переменную CConstantVariables.listMyContestData как список данных адаптера? Этот код указывает на утечку памяти?

+0

[Patterns Android Performance] (https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE) имеет [видео] (https://www.youtube.com/watch?v=BkbHeFHn8JY&index=6&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE) о том, как представления, статические и действия влияют на сбор мусора и память. –

ответ

1

GC собирает все объекты, на которые не ссылаются объекты GC-кореньGC-корневые объекты, как правило:

  • все запущенные потоки
  • все статические поля

В вашем образце: CConstantVariables.listMyContestData статична и поэтому потенциальный источник утечки памяти. Вы должны держать содержание этого списка под контролем:

  • убедитесь, что этот список не содержит объекты, которые вам больше не нужны
  • гарантировать, что объекты в этом списке не держат ссылки на объекты что вам больше не нужно.

Использование статического списка в адаптере не помешают адаптер от сборщика мусора (когда нет больше ссылок из GC-корня объекты к адаптеру).

Я предлагаю вам это очень хороший разговор об отслеживании утечки памяти в Android: https://www.youtube.com/watch?v=_CruQY55HOk

0

Кажется, что ваш просмотр по-прежнему будет собираться мусором, если он соответствует указанному жизненному циклу фрагмента. Что касается статических CConstantVariables, он останется в памяти, пока ваше приложение не закончится.

Пожалуйста, обратитесь к Static member views in activity - Android и Using static variables in Android

0

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

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

Да, статические переменные могут создавать утечки памяти, как его когда-то назначены, и если не установлен null может дать определенное место в памяти навсегда, пока ваше приложение заканчивается. В случае больших сохраненных значений, таких как растровые изображения, вы можете четко наблюдать разницу между статической и нормальной переменной.

Заключение: избегайте статики столько, сколько вы можете, пока не останетесь с другим выбором, кроме использования статического электричества. Если вы используете, то продолжайте очищать сохраненную память, вы не можете удалить местоположение из ОЗУ, но можете установить значение как null.

Примечание: Функции, используемые со статическими переменными, будут обычно собираться с мусором, например, адаптер списка, если он не является статичным. (В вашем случае у вас есть сборщик мусора).

Надеюсь, что я смогу хорошо объяснить или прокомментировать, если возникнут какие-либо вопросы или какие-либо исправления.

Cheers!

Смежные вопросы