j2me应用程序中的OutOfMemoryError

我在J2ME应用程序中获取OutOfMemoryException

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

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

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

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

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

创建图像1 – >创建图像2->创建图像3 – >重绘 – >重绘 – >重绘 – >重绘 – >重绘 – >。

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

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

错误的原因是缺乏记忆。 对不起,说明了,但你问:-)

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

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

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

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

 Runtime.getRuntime().gc(); 

代替

 System.gc(); 

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

原因:

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

解决方案:

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

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

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

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

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

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

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

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

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

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