繁体   English   中英

j2me应用程序中的OutOfMemoryError

[英]OutOfMemoryError in j2me application

我在J2ME应用程序中得到OutOfMemoryException

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

我发出一个http请求。 请求未完成时,屏幕上会显示一个加载图像(就像浏览器在加载页面时显示的一样)。 这是通过创建图像并重新粉刷屏幕来完成的。

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

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

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

创建图像1->创建图像2->创建图像3->重新绘制->重新绘制->重新绘制->重新绘制->重新绘制->

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

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

错误的原因是内存不足。 不好意思说,但你问了:-)

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

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

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

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

Runtime.getRuntime().gc();

代替

System.gc();

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

原因:

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

解决方案:

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

OutOfMemoryException出现在j2me中,因为该变量在使用完后无法释放其内存。 我们可以显式释放变量的内存。

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

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

您的三个“正在加载”图像是否完全不同? 还是它们在很大程度上是相同的图像,而每个图像之间只有一小部分不同(例如,所有图像都是在大白场中间的“旋转轮”的各种图像)?

如果您可以让图像1成为正在显示的完整图像,而图像2和3是可以绘制在图像1上方的小图像,则可以节省很多内存。

即:首先创建图像1-3。 然后,根据动画中的步骤,在repaint()上始终绘制图像1,并可选地绘制图像2或图像3。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM