Типы примитивов собраны "мусор" в Android?

Я знаю, что это может быть немым вопросом, но мое образование находится больше в C++ и управлении моей собственной памятью.

Я в настоящее время сокращаю каждое выделение, что я могу от одной из моих игр, чтобы попытаться уменьшить частоту сборки "мусора" и воспринятой "задержки", таким образом, для каждой переменной, которую я создаю, который является Объектом (String и Rect, например) я удостоверяюсь, что создаю его перед рукой в моем конструкторе и не создаю временные переменные в простых 10 функциях строки... (Я надеюсь, что это имеет смысл),

Так или иначе я работал, хотя это еще многие сегодня вечером и я понял, что могу быть абсолютно неправ относительно своего предположения на сборке "мусора", и типы примитивов (интервал, булевская переменная, плавание) являются этими переменными типа примитива, которые я создаю в 10 функциях строки, которые становятся названными 20 раз второе добавление к моей проблеме сборки "мусора"?

Так год назад каждые несколько секунд я видел бы сообщение в logcat как

GC освободил 4 010 объектов / 484 064 байта в 101 мс

Теперь я вижу что сообщение каждые 15-90 секунд или так...

Таким образом перефразировать мой вопрос: типы примитивов (интервал, плавание, булевская переменная, и т.д.) включены при наблюдении этого сообщения?

16
задан snctln 19 March 2010 в 02:28
поделиться

2 ответа

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

Например, если вам нужна HashMap <> целочисленных ключей, вы должны использовать HashMap. Обратите внимание: поскольку int не является объектом, его нельзя использовать в контейнере. Целое число - это объектная версия примитива типа int. Когда вы пишете такой код, для вас будет автоматически создан объект типа Integer:

HashMap<Integer, Object> map = new HashMap<Integer, Object>();
int someNum = 12345;    // no object created.
map.put(someNum, null); // Integer object created.

Обратите внимание, что то же самое произойдет, если вы не используете дженерики, но даже более скрыты:

HashMap map = new HashMap();
int someNum = 12345;    // no object created.
map.put(someNum, null); // Integer object created.

В этой конкретной ситуации вы может использовать класс Android SparseArray, который является контейнером примитивных целочисленных ключей.

25
ответ дан 30 November 2019 в 17:15
поделиться

Кажется вроде ответ нет. Похоже, что в Java примитивы помещаются в стек, а не в кучу, и собираются только объекты. Я нашел много коротких ссылок на это повсюду, проверьте Википедию. Для более тяжелого чтения см. Статью о реализации сборки мусора JVM, в которой более однозначно объясняется, что примитивы хранятся в физически отдельных ячейках памяти, поэтому они не включены по ошибке в сборку мусора здесь . Если вам хочется бегло просмотреть, страница 4 - это то место, где это объясняется наиболее прямо.

здесь приведены специфические для Android потоки, в которых говорится, что gc сканирует только указатели и как проверяет, что

6
ответ дан 30 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: