2017-11-08 14 views
0

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 sizeretained 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]; 
    } 
} 
+0

私は質問を理解しません。実際には記憶が漏れているのですが、どうしてそうではないと言っていますか? – Shadov

+0

Androidスタジオ3.0のメモリプロファイラには、最初から40MBのメモリが残っていることが示されています。ちょっと高いですが、ガベージコレクターが起動して40MBに戻します。 – Solidak

+0

あなたのonClickで '100000'のようなことをするループを追加し、数回クリックしてください:) – Shadov

答えて

0

浅いサイズは保持サイズはゴミがここ

でリファレンスを参照してください収集した後に解放されるサイズであるのに対し、今占有されているメモリであり、 shallow vs retained size

+0

わかりました:私はまた、より長い回答をここにリンクします:https://stackoverflow.com/questions/12707572/android-what-is-the-differences-between-shallow-and-retained-heap – Solidak

関連する問題