私はアンドロイドでメモリを解放することについて何かを読みましたが、私はまだ動作について混乱しています. 私の場合、メモリがいつ割り当てられ、いつ解放されるか、単純なアプリケーションをテストします。私には2つの活動があります。MainActivity には ImageView があります。getResources().getDrawable(int id)
または 経由でドローアブル イメージを参照しBitmapFactory.decodeResource(Resources res, int id)
ます。どちらの方法でも確実に画像にメモリを割り当てていますが、アクティビティを破棄したり、ビットマップをリサイクルしたり、すべての変数を null に設定したりしても、このメモリは解放されません。
public class MainActivity extends Activity {
private ImageView view;
private Drawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (ImageView) findViewById(R.id.image);
// tried with BitmapFactory.decode...
drawable = getResources().getDrawable(R.drawable.connect);
view.setImageDrawable(dr);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
SecondActivity.class);
startActivity(intent);
// tried with and without finish
finish();
}
});
}
@Override
protected void onResume() {
super.onResume();
Double allocated = new Double(Debug.getNativeHeapAllocatedSize())
/ new Double((1048576));
Double available = new Double(Debug.getNativeHeapSize()) / 1048576.0;
Double free = new Double(Debug.getNativeHeapFreeSize()) / 1048576.0;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(2);
System.out.println("SYSO : " + df.format(allocated) + "MB of "
+ df.format(available) + "MB (" + df.format(free) + "MB free)");
System.out.println("SYSO : "
+ df.format(new Double(
Runtime.getRuntime().totalMemory() / 1048576))
+ "MB of "
+ df.format(new Double(
Runtime.getRuntime().maxMemory() / 1048576))
+ "MB ("
+ df.format(new Double(
Runtime.getRuntime().freeMemory() / 1048576))
+ "MB free)");
}
@Override
protected void onDestroy() {
super.onDestroy();
// tried using BitmapFactory and bitmap.recycle()
dr.setCallback(null);
dr = null;
view = null;
System.gc();
Runtime.getRuntime().gc();
}
}
2 回目の活動でも記憶を記録します。私のアプリケーションには、起動時に約 8 ~ 9MB のランタイム メモリがあることがわかりました。メイン ビューに画像を配置すると、メモリが 20MB 程度まで増加します。finish()
コールバックを null に設定したり、画像をリサイクルしたりするなど、すべての解放機能を使用してアクティビティを終了すると、2 番目のアクティビティのメモリがまだ割り当てられているのはなぜですか? 2 番目のアクティビティを数回再開していますが、メモリはまだ割り当てられています。最初のアクティビティが破棄されました。そのメモリを解放するにはどうすればよいですか? callback = null
ビットマップを設定またはリサイクルせずに動作をテストし、 MainActivity
. その後、再開するたびにMainActivity
、履歴書ごとにメモリが約10MB増加します。古い参照は破棄されず、毎回新しいイメージが割り当てられるため、問題ないようです。しかし、なぜこの最初の画像の最初の記憶が破壊されないのでしょうか?