質問

私は時間をかけてスローダウンに苦しんでいるモバイルアプリケーションを持っています。私の勘では、(一部ではこの記事によって供給する 、)このアプリを遅く、メモリの断片化が原因であるということですが、私はよく分かりません。ここで時間をかけてアプリのメモリ使用のきれいなグラフがあります:

フラグルロックhttp://kupio.com/image-dump/fragmented.png

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

図から分かるように、

、まったく同じタスクの4回のランの各々は、実行に時間がかかり。グラフの低点を同じレベルにすべての戻りのタスク実行間の任意のメモリリークがあるように思われないようにします。

私が知りたいことは、実現可能な説明メモリの断片化されているか、私はすでに見ているの多くを行ってきたことを念頭に、最初に別の場所になりますか?グラフ上の低ポイントが比較的低いので、私の仮定は問題を起こすために、小さなメモリホールがたくさんあることができないので、この状態でメモリは非常に断片化されないだろうということです。

私は、J2MEのメモリアロケータががどのように動作するか分からないので、私は本当に知りません。誰もが助言することはできますか?他の誰がこれで問題を抱えていたとアプリのメモリプロファイルを認識していますか?

役に立ちましたか?

解決

プールからそれらを取得することにより、タスクを実行するたびにメモリの「同じ」チャンクを使用しています:あなたは少し時間を持っていれば、

は、あなたがメモリプールの技術を使用してメモリを再利用して、あなたの理論をテストすることができそして、リリース時にそれらを返します。

あなたはまだ、この調査を行った後、分解パフォーマンスを見ている場合は、それが問題の原因メモリの断片化ではありません。私たちのすべては、あなたの結果を知っていると我々はさらにトラブルシューティングに役立つことができます。

他のヒント

メモリの断片化は、それを占めるだろう...何明らかではないが、メモリのアプリの使用はページングを引き起こしているかどうか?これはまた、遅いものまででしょう....と同じ問題が発生する可能性があります。

これは、問題は本当に多くのあなたはそれについて行うことができますがない、メモリの断片化です。

しかし、あなたが絶望にあきらめる前に、それは予想外の場所で実行する多くの時間を費やしているかどうかを確認するために、実行プロファイラを使用してアプリケーションを実行してみてください。スローダウンが原因あなたのアルゴリズムでは、問題、およびメモリの断片化とは何の関係に実際にあることも可能です。人々は、すでに述べたように、J2MEのガベージコレクタは、断片化の問題に苦しむべきではありません。

ガベージコレクションの統計を見て考えてみましょう。あなたの理論が保持することである場合は、最初より最後の実行時に、より多くを持っている必要があります。もう一つの考えは、アプリケーションが少ないを持っているので、何か他のものは、あなたの記憶を食べることかもしれません。

言い換えれば、プロファイラ時間:)

あなたはこれをどのようなOS上で実行していますか?私は、WindowsのCE5(またはWindows Mobile)デバイスといくつかの経験を持っています。 CE5のオペレーティングシステムレベルのメモリアーキテクチャは非常に破壊され、メモリを多用するアプリケーションのためにすぐに失敗します。あなたのグラフは、任意のスケールを持っていませんが、すべてのプロセスは、CE5上のアドレス空間の32メガバイトを取得します。 VMと共有ライブラリは非常に少し左であなたを残して、同様にそのの公正な取り分がかかります。 これを回避する唯一の方法は、あなたの代わりにコレクタに戻ってそれを与え、後に再割り当ての割り当てられたメモリを再利用することです。これは通常、Javaでしたいと思うよりも、当然のことながら、はるかに低レベルのプログラミングですが、このプラットフォームでは、あなたは運が悪いかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top