在Codename One中避免内存不足

时间:2017-03-06 05:32:18

标签: java codenameone

我与this SO question中描述的情况相同。事实上,我的应用程序大量依赖URLImage,并使用SidePanel进行导航。一段时间后,当我按下后退按钮(Android)时因为OOM抛出而变得无法使用。

所以我需要建议来避免这些OOM错误。在上面提到的问题中给出了第一个建议,即不传递对前一个表格中任何元素的引用。

确实,我正在传递整个表单,因为我想知道" generic"调用下一个表单(当用户点击后退按钮时知道去哪里)。所以我改变了这一点,现在通过了Form的类(myForm.getClass())。但是,性能监视器仍然显示超过200 MB作为"图像内存开销"。

所以也许问题出在其他地方,因为我还需要传递自定义对象。实际上我有一个表单A,它列出了InfiniteScrollAdapter中的所有报表。报告是从服务器获取的。然后当用户点击一行时,它会以另一种形式(B)打开所选的报告详细信息(日期,图像,位置......),最后如果用户点击图像或在该位置打开另一个表单使用大尺寸的图像或位置的Google Map。

如果无法传递这些报告,我该怎么办,或者这些问题是否真的来自这些参考文献?

任何帮助真的很感激; - )

1 个答案:

答案 0 :(得分:1)

我猜测你正在使用有问题的图像,而有太多的图像没有发布它们。一个很好的工具是内存分析器,我使用NetBeans中的一个,它允许你通过分配堆栈进行挖掘,看看哪个代码分配了哪个内存块。

我还建议阅读developer guide graphics sectionperformance section(也讨论内存)中各种类型的图片。总结一下,请确保您的图像尺寸正确且为EncodedImage或其变体。您可能希望unlock()未使用的编码图像,以便GC可以对它们采取更积极的行动。

一旦您将泄漏范围缩小到一组特定的图像,就如何管理这一点提出具体建议要容易得多。