我在J2ME应用程序中获得OutOfMemoryException
。
如何找到导致此错误的原因?以及如何防止出现此错误?
我发了一个http请求。当请求未完成时,屏幕显示加载图像(如浏览器在加载页面时显示)。这是通过创建图像并重新绘制屏幕来完成的。
创建图片1 - >重画 - >创建图像2-> repaint->创建图像3 - >重画 - >创建图像1->重画 - >
我注意到(使用wtk内存监视器)这消耗了太多内存,而不是垃圾回收。
然后我尝试创建一个类图像池。该类创建所有图像,然后显示它们。
创建图片1 - >创建图像2->创建图像3 - >重画 - >重画 - >重画 - >重画 - >重画 - >
第二种情况似乎没有内存消耗的那么多。 (使用wtk内存监视器)。
但是,我认为(不确定是否这样)这两种方法都有助于导致OutOfMemoryException
。
答案 0 :(得分:2)
错误的原因是内存不足。很抱歉说明显了,但你问: - )
为了诊断确切的问题,需要一些源代码。
您还应该查找代码的一部分,这些代码要么进行递归方法调用,要么在循环内部分配内存。递归调用通常会生成StackOverflowException,但值得一看。在循环内分配内存可能很快导致OutOfMemoryError。
答案 1 :(得分:1)
你的OutOfMemoryException
移动设备上的图像显示是由于堆内存不足而导致的。将垃圾收集器作为System.gc();
运行,但不幸的是它在J2ME中不起作用。
所以,我们可以在这里使用
Runtime.getRuntime().gc();
而不是
System.gc();
答案 2 :(得分:1)
当模拟器中存在内存不足时,通常会发生此问题。
原因:
解决方案:
gc()
函数删除垃圾回收。答案 3 :(得分:0)
根据设备的限制,创建和保留3个全屏图像可能是个问题。
你的三个'加载'图像是否大不相同?或者它们在很大程度上是相同的图像,只有一小部分不同于图像(例如,所有都是在大白场中间的'旋转轮'的各种图像)?
如果你可以让图像1成为你正在显示的完整图像,而图像2和3是可以在图像1上绘制的小图像,那么你可以节省大量的内存。 / p>
即:在开头创建图像1-3。然后,在repaint()上,总是绘制图像1,可选择图像2或图像3,具体取决于动画中的步骤。
答案 4 :(得分:0)
仅创建一次图像并在任何需要的地方重复使用它们,并在需求结束后立即将其引用为null。这将使它们被垃圾收集。
不要创建任何不需要的变量或对象(尤其是图像对象)。
您可以通过调用System.gc()
显式启动垃圾收集。但经常调用它可能会影响性能
答案 5 :(得分:0)
OutOfMemoryException
来自j2me,因为变量在使用完成后没有释放其内存。我们可以显式释放变量的内存。
任务完成后,释放该变量的内存。尝试不要一次加载所有图像延迟加载。与其他变量相比,图像占用大空间。所以使用低质量的图像,也不要在应用程序使用系统字体中使用自定义字体。