AndroidでOutOfMemory例外をシミュレートしようとしています。私の方法は、基本的に静的なArrayListを維持して、long[2048]
配列を追加し続けます。連続したメモリ割り当てでリークが発生しない
私はこのプログラムをしばらく実行しており、long[2048]
の685インスタンスを収集しました。 Android Studioの3.0プロファイラを使用すると、ヒープダンプは次のようになります。
| class name | alloc count | shallow size | retained size |
| ---------- | ----------- | ------------ | ------------- |
| long[] | 685 | 9997168 | 9997168 |
したがって、メモリはガベージコレクションされません。それにもかかわらず、アプリのヒープメモリは40Mbのままで、落ちることはありません。
どうしてですか?明日はないように、アプリがメモリを漏らしてはいけないのですか?今回はJVMのトリックは何ですか?
また、shallow size
とretained size
の違いは何ですか?
PS:ここでは、コードは次のとおりです。
public class MainActivity extends AppCompatActivity {
static List<long[]> myList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myList.add(loadStuff());
}
});
}
static long[] loadStuff() {
return new long[2048];
}
}
私は質問を理解しません。実際には記憶が漏れているのですが、どうしてそうではないと言っていますか? – Shadov
Androidスタジオ3.0のメモリプロファイラには、最初から40MBのメモリが残っていることが示されています。ちょっと高いですが、ガベージコレクターが起動して40MBに戻します。 – Solidak
あなたのonClickで '100000'のようなことをするループを追加し、数回クリックしてください:) – Shadov