Этот вопрос касается управления памятью в Java из соображений производительности :, потому что я разрабатываю эту программу как игру для Android, а сборщик мусора памяти снижает мою производительность. Итак, я проделал большой объем работы, и оказалось, что я проделал большую работу по оптимизации использования памяти в моей игре, но у меня есть одна проблема :итераторы!
Вот что я делаю:
Мои ассигнования полны этого:
466 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
465 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
464 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
463 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
461 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
456 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
454 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
453 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
452 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
Так что единственными объектами, которые выделяются во время работы моей игры, являются итераторы! Хорошо, теперь, чтобы исправить это... какой код вызывает проблему, которую я спросил... вот:
for (Segment side : listOfSides.getSides()) {
// do stuff
}
Да, оказывается, для -каждый синтаксис вызывает итератор за кулисами для заполнения каждого элемента. Это имеет смысл и именно то, что я ожидал, но я не осознавал, что это может так ужасно накапливаться и вызывать проблемы с производительностью в играх. Если бы я мог избавиться от этой проблемы, моя игра действительно заработала бы молниеносно, независимо от того, на каком телефоне она была. Итак, мой вопрос: :что бы вы сделали, чтобы все эти временные итераторы не создавались, а затем немедленно отбрасывались, что приводило к неприятным запускам GC? Бонусные баллы за то, что я сделал так, чтобы мой код не стал совсем уродливым! (И использование ndk на Android не вариант)
P.S.Я думал, что для всех моих ArrayLists я мог бы начать использовать функцию get (int i ), поскольку они представляют собой массивы за кулисами, и целое число, которое я бы использовал для индексации, которое будет помещено в стек, а не в кучу. Но для других объектов, таких как HashMap и LinkedList, я не уверен, что делать.