• ベストアンサー

Javaでメモリ不足を引き起こす方法

Javaを使って、システムのメモリ不足を引き起こす方法を考えています。 (動作検証のためで、悪いことを考えているわけではありません^^;) 下記のプログラムでメモリを大量に消費するかなと思ったのですが、 Linux上のvmstatやtopなどで確認してもそれほど変化がありません。 while (true) { Integer[] ii = new Integer[100]; for (int i = 0; i < 100; i++) { ii[i] = new Integer(i); } } Javaの1プロセスが使えるメモリの上限があるので、メモリを食いつぶすプロセスを 大量に実行すれば良いと考えているのですが、メモリを食いつぶす方法が分かりません。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

このプログラムだと、whileで繰り返してInteger[] ii = new Integer[100];すると、その前の繰り返しでiiに設定されていた配列は、どこからも参照されなくなるため、ガベージコレクションの対象となる。このため、常に、現在使っているiiに設定されているInteger配列以外は、必要に応じてガベージコレクションで消去されるため、永遠にメモリ不足にはならない。 メモリ不足を起こすには、生成されたオブジェクトがすべて参照された状態である必要がある。試してないが、例えば、ArrayListなどに次々とaddしていくのを繰り返したりすれば、メモリが消費される一方になるんじゃないだろうか。

oubokun
質問者

お礼

logger_manさん、 ArrayListでaddし続けるとメモリが消費され続けました。 ありがとうございました。

その他の回答 (1)

  • e00083
  • ベストアンサー率31% (25/80)
回答No.2

私の場合は、クラスを多数作りすぎて、OutOfMemoryErrorを投げられたため、try catchで、スローされるとそこで、インスタンス化を止めるプログラムを作ったことがありますね。 大量のクラスをインスタンス化すると、イヤでも出会えますよ。 ちなみに、OSの動作等は問題は起こりませんでした。

oubokun
質問者

お礼

e00083さん、 ArrayListでうまくいきましたが、try catchは参考になりました。 catchでスリープすると、良い感じの動作になりました。 ありがとうございました。 ちなみに10数個プロセスを実行すると、スワップ領域も食いつくした後、Linuxが強制的に再起動してしまいました。

関連するQ&A