j2me应用程序中的OutOfMemoryError

时间:2009-07-01 18:38:52

标签: java java-me mobile

我在J2ME应用程序中获得OutOfMemoryException

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

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

创建图片1 - >重画 - >创建图像2-> repaint->创建图像3 - >重画 - >创建图像1->重画 - >

我注意到(使用wtk内存监视器)这消耗了太多内存,而不是垃圾回收。

然后我尝试创建一个类图像池。该类创建所有图像,然后显示它们。

创建图片1 - >创建图像2->创建图像3 - >重画 - >重画 - >重画 - >重画 - >重画 - >

第二种情况似乎没有内存消耗的那么多。 (使用wtk内存监视器)。

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

6 个答案:

答案 0 :(得分:2)

错误的原因是内存不足。很抱歉说明显了,但你问: - )

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

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

答案 1 :(得分:1)

你的OutOfMemoryException移动设备上的图像显示是由于堆内存不足而导致的。将垃圾收集器作为System.gc();运行,但不幸的是它在J2ME中不起作用。

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

Runtime.getRuntime().gc();

而不是

System.gc();

答案 2 :(得分:1)

当模拟器中存在内存不足时,通常会发生此问题。

原因:

  1. 你使用了太多图片。
  2. 你正在初始化太多的物品。
  3. 您的设备没有您需要的内存。
  4. 解决方案:

    1. 您可以按降序加载图片。
    2. 您可以使用gc()函数删除垃圾回收。
    3. 如果未使用某些对象,则为该对象指定null。
    4. 不要在循环中初始化对象。
    5. 不要一次又一次地创建相同的图像。如果你想使用相同的图像,只需使用相同图像的参考(如果你在不同的类中创建相同的图像,可能会出现这个问题)

答案 3 :(得分:0)

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

你的三个'加载'图像是否大不相同?或者它们在很大程度上是相同的图像,只有一小部分不同于图像(例如,所有都是在大白场中间的'旋转轮'的各种图像)?

如果你可以让图像1成为你正在显示的完整图像,而图像2和3是可以在图像1上绘制的小图像,那么你可以节省大量的内存。 / p>

即:在开头创建图像1-3。然后,在repaint()上,总是绘制图像1,可选择图像2或图像3,具体取决于动画中的步骤。

答案 4 :(得分:0)

仅创建一次图像并在任何需要的地方重复使用它们,并在需求结束后立即将其引用为null。这将使它们被垃圾收集。

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

您可以通过调用System.gc()显式启动垃圾收集。但经常调用它可能会影响性能

答案 5 :(得分:0)

OutOfMemoryException来自j2me,因为变量在使用完成后没有释放其内存。我们可以显式释放变量的内存。

任务完成后,释放该变量的内存。尝试不要一次加载所有图像延迟加载。与其他变量相比,图像占用大空间。所以使用低质量的图像,也不要在应用程序使用系统字体中使用自定义字体。