2009-07-01 9 views
2

J2MEアプリケーションでOutOfMemoryExceptionを取得しています。J2MEアプリケーションのOutOfMemoryError

このエラーの原因を確認するにはどうすればよいですか?このエラーを防ぐ方法は?

私はhttpリクエストを行います。リクエストが完了していない間、画面には読み込み中の画像が表示されます(ページが読み込まれているときにブラウザに表示されます)。これは、Imageを作成し、画面を再描画することによって行われました。

イメージの作成1 - > repaint - >イメージの作成2-> repaint->イメージの作成3 - > repaint - >イメージの作成1-> repaint - >

これは、ガベージコレクションされていないメモリが多すぎることに気付きました(wtkメモリモニタを使用して)。

次に、イメージのプールのようなクラスを作成しようとしました。このクラスはすべてのイメージを作成して表示します。

イメージの作成1 - >イメージの作成2->イメージの作成3 - > repaint - > repaint - > repaint - > repaint - > repaint - >

この2番目のシナリオでは、最初のシナリオと同じくらいメモリを消費していないようです。 (wtkメモリーモニターを使用)。

しかし、私はこの両方のアプローチが原因でこれが原因と考えています(確信が持てません)OutOfMemoryException

+0

デバッガで実行していますか? –

+0

私はデバイスで実行しています。私はエミュレータを使用して実行するとき、私はこのエラーが発生しません。 –

+0

使用しているIDEは何ですか?それはプロファイラを持っているかもしれません。あなたはこれを使って何がたくさんのメモリを使用しているのかを知ることができます。 – kwatford

答えて

2

エラーの原因はメモリ不足です。申し訳ありませんが、明らかに、あなたが尋ねた:-)

正確な問題を診断するには、いくつかのソースコードが必要です。

また、コード内で再帰的なメソッド呼び出しを行うか、ループ内でメモリを割り当てる部分を探す必要があります。再帰呼び出しは通常、StackOverflowExceptionを生成しますが、一見価値があります。ループ内にメモリを割り当てることで、すぐにOutOfMemoryErrorが発生する可能性があります。

+0

私は知っているメモリの不足です。しかし、アプリケーションは十分単純であり、この問題を起こすべきではありません。 –

+0

だから私はソースコードを尋ねた。私はそれが頬の「記憶がない」舌であると言った。 –

+0

質問にいくつかの情報を追加しました。 –

0

デバイスの制約によっては、3つのフルスクリーンイメージを作成して保存することが問題になることがあります。

3つの「読み込み中の」画像は大きく異なりますか?または、画像とは少ししか異なる、ほとんど同じ画像です(たとえば、すべて白い大きなフィールドの中央にある「回転ホイール」のさまざまな画像です)。

画像1が表示されている完全な画像になり、画像2と3が画像1の上に描画できる小さな画像である場合は、そのように多くのメモリを節約できます。

つまり、最初に画像1〜3を作成します。次に、repaint()では、アニメーションのステップに応じて、常にイメージ1を描画し、オプションでイメージ2またはイメージ3を描画します。

+0

すべての画像は小さく(16x16,460bytes)、私は再描画に位置を渡しています:repaint(100,73,16,16)。そして私は3ではなく8枚の画像を使用しています。 –

+1

あなたのhttpリクエストにはどのくらいのコンテンツが返されますか?それはあなたの記憶の誤りを引き起こしているのでしょうか? メモリの問題がイメージの作成/保持/ペイントであることが確かな場合は、Spriteクラスを使用してみてください。シナリオ#2で作成したクラスと似ているようで、携帯端末の厳しい制約に最適化されている可能性があります。 –

+0

http応答が小さいです。私はイメージが*唯一の*問題ではないと確信しています。誰か他の人のコードを嫌う!私はこのSpriteクラスをチェックします。 –

0

イメージを1回だけ作成し、必要に応じて再利用し、要件が終了するとすぐにnullへの参照を作成します。これにより、それらはガベージコレクションされます。

不要な変数やオブジェクト(特にイメージオブジェクト)は作成しないでください。

System.gc()を呼び出すことで、ガベージコレクションを明示的に開始することができます。しかし、これを頻繁に呼び出すとパフォーマンスに影響する可能性があります

1

OutOfMemoryExceptionモバイルでの画像表示は、ヒープのメモリが不足しているためにこれを行うことができます。 Garbage collectorをSystem.gc();として実行していますが、残念ながらJ2MEでは動作しません。

そこで、我々はこの問題は、エミュレータでメモリ不足がある場合に発生し、通常はここに代わり

System.gc(); 
1

Runtime.getRuntime().gc(); 

を使用することができます。

理由:

  1. あなたはあまりにも多くの画像を使用しています。
  2. オブジェクトをあまりにも多く初期化しています。
  3. あなたのデバイスは、必要なだけのメモリではありません。

ソリューション:

  1. あなたが降順にあなたのイメージを読み込むことができます。
  2. gc()機能を使用してガベージコレクションを削除できます。
  3. 一部のオブジェクトが使用されていない場合は、そのオブジェクトにnullを割り当てます。
  4. ループ内のオブジェクトを初期化しません。
  5. 同じイメージを何度も何度も作成しないでください。あなたは同じ画像を使用したい場合は、単に
0

OutOfMemoryExceptionがあるため、変数のJ2MEで来る(あなたは別のクラスで同じ画像を作成している場合、この問題が発生する可能性があります)同じ画像の参照を使用した後にそのメモリを解放されていませんその使用は完了です。変数のメモリを明示的に解放することができます。

タスクが完了したら、その変数のメモリを解放します。すぐにすべての画像を読み込まないようにしてください。 Imageは他の変数と比較して大きな領域を取る。低品質の画像を使用し、アプリケーションフォントでカスタマイズされたフォントを使用しないでください。

関連する問題