簡體   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