2009-07-01 75 views
2

我在J2ME应用程序中获取OutOfMemoryExceptionj2me应用程序中的OutOfMemoryError

如何找到导致此错误的原因?以及如何防止出现此错误?

我发出一个http请求。请求未完成时,屏幕显示加载图像(如浏览器显示加载页面时显示的内容)。这是通过创建一个图像并重新绘制屏幕来完成的。

create image 1 - > repaint - > create image 2-> repaint-> create image 3 - > repaint - > create image 1-> repaint - >。

我注意到(使用wtk内存监视器),这消耗了太多没有垃圾收集的内存。

然后我试着创建一个类的图像池。这个班级创建所有图像,然后显示它们。

create image 1 - > create image 2-> create image 3 - > repaint - > repaint - > repaint - > repaint - > repaint - >。

这第二种情况似乎消耗的内存不如第一种情况。 (使用wtk内存监视器)。

但是,我认为(不知道是否是这样)这两种方法都有助于导致此OutOfMemoryException

+0

你在调试器中运行它吗? – 2009-07-01 18:39:36

+0

我在设备上运行。当我使用模拟器运行时,我不会收到此错误。 – 2009-07-01 18:41:30

+0

你使用什么IDE,如果有的话?它可能有一个分析器,您可能可以使用它来查找使用这么多内存的内容。 – kwatford 2009-07-01 18:42:59

回答

2

错误的原因是内存不足。对不起,请注明,但你问:-)

一些源代码将需要为了诊断确切的问题。

您还应该查找代码的一部分,这些代码可能会执行递归方法调用或在循环内部分配内存。递归调用通常会产生一个StackOverflowException,但值得一看。在循环内分配内存可能会很快导致OutOfMemoryError。

0

根据设备的限制,创建并保留3张全屏图像可能是一个问题。

你的三个'加载'图像有很大的不同吗?或者它们的图像基本相同,只有一小部分图像与图像不同(例如,所有图像都是大白场中间的“纺车轮”的各种图像)?

如果您可以让图像1成为您显示的完整图像,而图像2和图像3可以是可以在图像1顶部绘制的小图像,那么您可以通过这种方式节省大量内存。

即:在开始时创建图像1-3。然后,在repaint()上,总是绘制图像1,并根据动画中的步骤绘制图像2或图像3。

0

只需创建一次图像,然后在需要的地方重新使用它们,并在需求结束时尽快将其引用为空。这将使他们被垃圾收集。

不要创建任何不需要的变量或对象(特别是图像对象)。

您可以通过调用System.gc()明确启动垃圾回收。但频繁调用可能会影响性能

1

您的OutOfMemoryException虽然在移动设备上显示图像是由于堆内存不足,可以通过。运行Garbage collector为System.gc();,但不幸的是它在J2ME中不起作用。

所以,我们可以在这里使用

Runtime.getRuntime().gc(); 

代替

System.gc(); 
1

这个问题时,有短暂的仿真器内存正常进行。

原因:

  1. 你使用太多的图像。
  2. 你正在初始化太多的对象。
  3. 你的设备没有你需要的那么多的内存。

解决方案:

  1. 可以按递减顺序加载图片。
  2. 您可以使用gc()函数删除垃圾回收。
  3. 如果某些对象未使用,则将空值赋予该对象。
  4. 不要初始化循环中的对象。
  5. 不会一次又一次地创建相同的图像。只要使用相同的图像的参考,如果你想使用相同的图像(如果要创建在不同的类相同的图像可能会出现此问题)
0

OutOfMemoryException进来J2ME,因为变量的不释放其内存后其使用完成。我们可以明确地释放变量的内存。

任务完成后,释放该变量的内存。尽量不要一次加载所有的图像做这个懒加载。与其他变量相比,图像需要较大的空间。所以使用低质量的图像,也不使用应用程序使用系统字体中的自定义字体。