Избегание нехватки памяти в Codename One
Я нахожусь в той же ситуации, что и в этом вопросе. На самом деле мое приложение опирается в основном на URLImage
а также использует SidePanel для навигации. Через некоторое время он становится непригодным из-за OOM, выбрасываемого при нажатии кнопки "назад" (Android).
Поэтому мне нужны советы, чтобы избежать этих ошибок OOM. В упомянутом выше вопросе был дан первый совет: не ссылаться ни на один элемент из предыдущей формы.
Действительно, я передавал всю форму, потому что хотел знать, откуда вызывается "общая" следующая форма (чтобы знать, куда обращаться, когда пользователь нажимает кнопку "Назад"). Так что я изменил это, и теперь передать класс формы (myForm.getClass()
). Однако монитор производительности по-прежнему отображает более 200 МБ как "накладные расходы на память изображений".
Так что, возможно, проблема в другом месте, так как мне нужно также передавать пользовательские объекты. Действительно, у меня есть форма A, в которой перечислены все отчеты в InfiniteScrollAdapter. Отчеты извлекаются с сервера. Затем, когда пользователь нажимает на строку, он открывает выбранные сведения отчета (дата, изображение, местоположение,...) в другой форме (B), и, наконец, если пользователь нажимает на изображение или местоположение, он открывает другую форму. с изображением в большом размере или Google Map местоположения.
Если невозможно передать эти отчеты, как я могу это сделать, или проблема действительно заключается в том, что они были переданы в ссылках?
Любая помощь очень ценится;-)
1 ответ
Я предполагаю, что вы используете проблемные изображения и их слишком много, не выпуская их. Хорошим инструментом для использования является профилировщик памяти, я использую тот, который используется в NetBeans, который позволяет вам копаться в стеке выделения и видеть, какой код выделяет какой блок памяти.
Я также рекомендовал бы прочитать о различных типах изображений в графическом разделе руководства разработчика и разделе производительности (в котором также рассматривается память). Подводя итог, убедитесь, что ваши изображения имеют правильный размер и EncodedImage
или вариация тех. Вы можете захотеть unlock()
неиспользуемые закодированные изображения, так что GC может действовать на них более агрессивно.
Как только вы сократите утечку до определенного набора изображений, вам будет гораздо проще дать конкретный совет о том, как справиться с этим.