Androidでのメモリオーバーフローとメモリリークについて

2461 ワード

①、メモリオーバーフロー(out of memory)とは、プログラムが仮想マシンにメモリを申請する際に、十分なメモリ空間がなく、out of memoryが現れたことを意味する.たとえばIntegerを申請しましたが、longを保存してから保存できる数は、メモリがオーバーフローしています.②、メモリリーク(memory leak)とは、プログラムがメモリを申請した後、すでに申請したメモリ空間を解放できないことを指し、一度のメモリリークは無視できるが、何度も後になるとメモリの積み重ねの結果が深刻になり、どれだけのメモリも占めてしまう.③、メモリオーバーフローとは、あなたが要求したメモリがシステムから与えられるものを超えていて、システムが需要を満たすことができず、オーバーフローが発生したことです.栗を挙げます:1つの皿にりんごを5つしか入れられませんが、あなたは6つ入れなければなりません.結局、地面に落ちて食べられません.これがオーバーフローです.たとえばスタックは、スタックがいっぱいになったときにスタックに入ると必ず空間オーバーフローが発生し、このときオーバーフローと呼ばれます.スタックが空いているときにバックスタックをしても空間オーバーフローが発生し、このときオーバーフローと呼ばれます.つまり、割り当てられたメモリが不足してデータ・アイテムのシーケンスが配置されます.これがメモリオーバーフローです.④、メモリリークとは、システムにメモリの割り当てを申請して使用し、new操作を行ったことを意味します.しかし、使い終わった後も返さない(delete)結果、申請したメモリは自分でもアクセスできなくなり(住所をなくしたのかもしれません)、システムも必要なプログラムに再び割り当てることができません.
メモリの漏洩:
1、androidデータベースクエリーではcursorを使用しますが、コードを書くときにcloseを忘れます.または、コードロジックの問題によりcloseが呼び出されない場合があります.2、I/Oデータストリーム操作、読み書きが終わっても閉じていない.3、Bitmap使用後にrecycle操作が行われていない4、Listview使用時にconvertView 5を多重化し、registerReceiverを呼び出した後にunregisterReceiverを呼び出していない()6、あとはあいまいなContext漏れ.次のコードを参照してください.
private static Drawable sBackGround;
@Override
protected void void onCreate(Bundle state){
super.onCreat();
TextView textview= new TextView(this);
textview.setText("Leaks are bad");
if(sBackGround==null){
sBackGround=getDrawable(R.drawable.large_bitmap);
}
textview.setBackGroundDrawable(sBackGround);
setContentView(textview);
}

コードの説明:このコードではstaticのDrawableオブジェクトを使用しています.これは通常、Activityをロードするたびにこのdrawableを作成したくないdrawableを呼び出すのに時間がかかります.この場合、staticを使用するのは間違いなく最も速いコード作成方式ですが、溝餅を比較します.1つのdrawableがviewに付加されると、このviewはこのDrawableのcallback(Drawable.setCallBack()を呼び出すことによって実現される)に設定される.これは、drawableがTextViewの参照を持ち、textviewがActivityの参照を持つことを意味します.これにより、Activityが破棄された後もメモリが解放されません.
メモリオーバーフロー:
画像メモリオーバーフローの処理について:1、メモリリファレンスの上でいくつかの処理をして、よく使うのはソフトリファレンスと弱いリファレンスです.2、メモリに画像をロードするときは、メモリに直接処理します.例えば、境界圧縮3、動的回収メモリ4、Dalvik仮想マシンのスタックメモリ割り当ての最適化5、カスタムスタックメモリサイズ.ここに性能の最適化に関するlint編(郭霖大神のプッシュ文章)を添付して、不要なコードを解決することを助けます:lintの使用について