2

私は時間の経過とともにスローダウンに苦しんでいるモバイルアプリケーションを持っています。私の感覚は、(部分的にはthis articleによって供給された)、これは、メモリの断片化によるアプリケーションの処理速度の低下によるものですが、わかりません。ここで時間をかけてアプリのメモリ使用のきれいなグラフです:断片化されたメモリはどのように見えますか?

fraggle rock http://kupio.com/image-dump/fragmented.png

グラフ上の4つのピークは、アプリ上の正確な同じタスクの4つの実行されています。私はタスクを開始し、それはメモリの束を割り当て、それは少し上に座って(上のフラットライン)、私はタスクを停止します。その時点で、System.gc()を呼び出します。メモリがクリーンアップされます。

正確に同じタスクの4回の実行のそれぞれは、実行に時間がかかります。グラフの下の点はすべて同じレベルに戻り、タスク実行の間にメモリリークがないように見えます。

私が知りたいことは、メモリ断片化が実現可能な説明であるか、私は既に見てきたことを心に留めて、別の場所で最初に見えるべきですか?グラフ上の低い点は比較的低いので、この状態では、問題の原因となる小さなメモリホールが多数存在することができないため、メモリは非常に断片化されません。

私はj2meメモリアロケータがどのように動作するのかわかりませんので、わかりません。誰も助言することはできますか?他の誰かがこれに問題があり、アプリのメモリプロファイルを認識していますか?

+0

通常のJava VMはガベージコレクションの任務の一部としてそのヒープを圧縮します(断片化を取り除く) - J2MEについてはわかりません... – bdonlan

答えて

1

あなたは少し時間を持っている場合は、メモリプールの技術を使用して再使用したメモリで、あなたの理論をテストすることができ:タスクの用途の各実行をそれらをプールから取り出してリリース時に返すことで、メモリの「同じ」チャンクが作成されます。

この調査を行った後でも依然としてパフォーマンスが低下している場合は、メモリの断片化が問題の原因ではありません。あなたの結果をすべてお知らせし、さらにトラブルシューティングをお手伝いします。

0

メモリの断片化はそれを説明します...明らかに不明なことは、アプリケーションのメモリ使用がページングを引き起こしているかどうかです。これもまた遅くなり、同じ問題を引き起こす可能性があります。

0

問題は実際にはメモリの断片化であり、それについてはあまりできません。

しかし、あきらめる前に、実行プロファイラーでアプリを実行して、予期しない場所で多くの時間を費やしているかどうかを確認してください。減速は実際にはアルゴリズムの問​​題に起因する可能性があり、メモリの断片化とは関係ありません。 J2MEのガベージコレクタは断片化の問題に悩まされるべきではないという人々の言葉通りです。

0

ガベージコレクションの統計情報を検討することを検討してください。あなたの理論が成立するならば、最初のものよりも最後の実行でもっと多くのことがあるはずです。もう一つの考えは、他のものがあなたの記憶を食べて、あなたのアプリケーションが少ないということかもしれません。

つまり

、プロファイラの時間:)

0

これはどのOSで実行していますか?私はWindows CE5(またはWindows Mobile)デバイスでいくつかの経験があります。 CE5のオペレーティングシステムレベルのメモリアーキテクチャはかなり壊れており、メモリ集約型アプリケーションではすぐに失敗します。グラフには縮尺はありませんが、すべてのプロセスはCE5上で32MBのアドレス空間しか取得できません。 VMと共有ライブラリでも同様にかなりのシェアを占め、ほとんど残されていません。 これを回避する唯一の方法は、コレクタに戻して後で再割り当てする代わりに、割り当てたメモリを再利用することです。これはもちろん、Javaでやってみたいプログラミングよりもはるかに低レベルのプログラミングですが、このプラットフォームでは不運になる可能性があります。

関連する問題