2012-02-10 3 views
1

Я запускаю симуляции, связанные с созданием дерева. Мое дерево имеет коэффициент ветвления от 2/3 до 7/8.Сборщик мусора против пула

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

Мне интересно, можно ли позволить сборщику мусора выполнять его работу («предлагаю» ему начать сбор с помощью System.gc(), когда я меняю корень дерева) или реализовать собственный пул для TreeNodes, и когда я меняю корень, переработайте все бесполезные узлы.

Ответ может быть прочитан как: очень ли оптимизирован сборщик мусора андроида или он предпочтительнее ограничивает создание/уничтожение объекта, даже если это довольно много? (Мне нужно было бы пройти все дерево и добавить каждый бесполезный узел в стек для моего пула)

Я прочитал, что андроид GC не так «развит» (он в основном работает, когда у вас низкая память.) Кроме того, я не знаю, удаляю ли только каждую ссылку на корень дерева позволит мусору gc собрать все дерево за один проход или будет только gc только узлом, потом дочерними узлами следующего прохода и т. д.

ответ

1

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

GC работает на поколениях. В основном ваши распределения разделяются на поколения. Поскольку ваше приложение загружает все распределения, подпадает под генерацию 0. И по мере того, как приложение развивается, ваши распределения помещаются в Generation 1 и 2. GC, когда он запускается, не очень часто работает на Generation 0, как и на 1. Аналогично, он не запускается чаще всего на генерации 1, как это было бы на 2. Это делается с предположением, что объекты, которые вы выделяете во время загрузки, не должны быть освобождены так часто, как объекты, созданные позже.

Интересная цитата из http://chaoticjava.com/posts/how-does-garbage-collection-work/

  • В любом приложении, объекты могут быть классифицированы в соответствии с их жизни линии.
  • Некоторые объекты недолговечны, например, большинство местных переменных , а некоторые долгоживущие, такие как основа приложения .
  • мысли о поколениях сбора мусора была возможно с пониманием того, что в applicationâ € ™ с сроком службы, наиболее воплощенные объекты недолговечны, и что несколько соединений между долгоживущими объектами к кратковременному объектов.
+0

Я уже прочитал эту статью (и да, это действительно интересно), но я говорю конкретно об android gc. В моем приложении он швы для запуска часто (логарифм печатает GC_Concurrent, бесплатно x% y/z, принято 5ms + 6ms). В моем приложении не проблема с производительностью (он по-прежнему работает на 60 кадров в секунду), мне больше всего интересно узнать о лучших практиках ** для платформ Android (так мобильных) ** (статья с 2008 года, поэтому я не думаю, что она может применяться на android gc, кроме того, я думаю, что андроид gc сильно изменился в более поздних версиях) –

+0

Реализация собственных treenodes на самом деле интересный способ его решения. Вопрос в том, что вы здесь измеряете. Если вы не измеряете производительность, то использование памяти? Если вы не знаете, что вы здесь измеряете, вы не знаете, какие выгоды могут вам дать.Является ли GC занятием слишком много времени, разве вы не получаете ответ, который ожидаете от своего приложения? Это занимает слишком много памяти? Как вы думаете, написав свой собственный пул, вы улучшите gc? Если gc - это ваша проблема, тогда вы должны измерить, сколько времени используется gc, а затем написать свой пул и снова измерить. Вы измеряете? – Siddharth

+0

У меня уже есть общий пул, поэтому писать пул для моего TreeNode - это вопрос обновления для исправления значений при запросе TreeNode и обхода дерева для утилизации всех детей при переработке TreeNode. На данный момент память не кажется проблемой (я еще не пробовал еще долгое моделирование, так как у меня все еще есть ошибка для решения в моем коде), а cpu тоже не слишком, но поскольку я запускаюсь на мобильных устройствах , чем эффективнее мой код, тем меньше батарея я сделаю пользователем отходы, и андроид жесток по этому вопросу (он ясно показывает, сколько батареи потребляет приложение). Нет, я не измеряю .. (хороший момент) –

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