2012-01-11 15 views
1

私はレイアウトに(ほとんどの)画像を持つアプリケーションを持っています。私が理解するように、Androidはもうアクティビティが必要ないときにメモリを解放するはずです。したがって、私は、アクティビティがonPause()を手動で行ったときに、私のアプリのレイアウトで使用されるDrawableを解放していません。私はAndroidがこれを行う必要があることを理解します。 ( - getTotalPrivateDirty()ヒープ)ごとに作成された活動にAndroid - その他のメモリ関連の問題はありません

{ 
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    android.app.ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); 
    activityManager.getMemoryInfo(memoryInfo); 

    Log.i("MEMCHECK", " memoryInfo.availMem " + memoryInfo.availMem + "\n"); 
    Log.i("MEMCHECK", " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n"); 
    Log.i("MEMCHECK", " memoryInfo.threshold " + memoryInfo.threshold + "\n"); 

    android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids); 
    for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray) { 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n"); 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n"); 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n"); 
} 

、メモリフットプリントが成長:私はメモリの状態を確認するために、このコードを使用し、

。私のアプリのメモリのすべてのkbは本当に重要なので、私はこれをやりたいとは思わない。このコールバックが処理される。また

、:ちょうどそのよう

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 

    } 
} 

空、。ヒープは10MBから20MBに拡大します。 100%。これは正常ですか?避ける方法?

+0

を確認するために、新しい活動(簡単なもの)で、あなたのメモリをチェックし、私はチェックのためのあなたのアプローチが有効であるとは思いません。問題は、Androidがガベージコレクトをいつ収集するかを正確には知らないことです。一時停止/破壊されたアクティビティは、メモリが必要になるまでgcできません。またはすぐにgcできます。これを知る(簡単な)方法はありません。 – THelper

答えて

1

)あなたの代わりにガベージコレクタに依存している、手動でメモリを解放する必要があります。 また、ビューのコンテキストを管理する必要があります。可能な場合は、ビューをアクティビティ内でのみ使用するか、アクティビティコンテキストを割り当てるか、リスナ/コールバックをビュー内でのみ使用するか、ビューコンテキストを割り当てるかのように、最低レベルでコンテキストを割り当てることができます。

また、手動でxmlドロワブルをアンバインドすることもできます。

+0

どのようにイメージのメモリを解放しますか?最後にビットマップ上で 'recycle'を呼び出すことでメモリが解放されないことを確認しました... – WarrenFaith

+0

@jitendra sharma:これ以上のことを説明できますか?ビューはアクティビティでのみ使用され、リスナ/コールバックをビュー内でのみ使用する必要がある場合は、ビューコンテキストを割り当てます。どうもありがとう。 –

+0

[この記事](http://stackoverflow.com/a/6779164/741249)にコード例があります。また、さらなる説明がここにあります(http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html) – THelper

0

他のアプリがonPauseとonStopの両方でメモリを必要とする場合、Androidは使用されていないアクティビティを強制終了します。 onPauseまたはonStopをオーバーライドして手動でメモリを解放することができます。

+1

部分的に正しい。あなたがアプリが唯一実行中のアプリであっても、利用可能な完全なメモリを得ることはできません。各VMインスタンスには、使用可能なメモリの一部しかありません。 – WarrenFaith

-1

が、これは多くのメモリを節約し、可能な静的最終的な変数として頻繁に使用するようにしてください。画像やコールバックの

+0

実際に静的を使用するとメモリリークの原因になることがあります。[this post](http://stackoverflow.com/q/5504071/741249) – THelper

0

私は(仕上げを呼び出して、アクティビティのメモリは、そのdestroydと自動的に洗浄されると仮定)

関連する問題