dポイントプレゼントキャンペーン実施中!

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プロセスが使えるメモリの上限があるので、メモリを食いつぶすプロセスを
大量に実行すれば良いと考えているのですが、メモリを食いつぶす方法が分かりません。

よろしくお願いいたします。

A 回答 (2件)

このプログラムだと、whileで繰り返してInteger[] ii = new Integer[100];すると、その前の繰り返しでiiに設定されていた配列は、どこからも参照されなくなるため、ガベージコレクションの対象となる。

このため、常に、現在使っているiiに設定されているInteger配列以外は、必要に応じてガベージコレクションで消去されるため、永遠にメモリ不足にはならない。

メモリ不足を起こすには、生成されたオブジェクトがすべて参照された状態である必要がある。試してないが、例えば、ArrayListなどに次々とaddしていくのを繰り返したりすれば、メモリが消費される一方になるんじゃないだろうか。
    • good
    • 0
この回答へのお礼

logger_manさん、

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

お礼日時:2009/07/28 04:07

私の場合は、クラスを多数作りすぎて、OutOfMemoryErrorを投げられたため、try catchで、スローされるとそこで、インスタンス化を止めるプログラムを作ったことがありますね。


大量のクラスをインスタンス化すると、イヤでも出会えますよ。
ちなみに、OSの動作等は問題は起こりませんでした。
    • good
    • 0
この回答へのお礼

e00083さん、

ArrayListでうまくいきましたが、try catchは参考になりました。
catchでスリープすると、良い感じの動作になりました。
ありがとうございました。

ちなみに10数個プロセスを実行すると、スワップ領域も食いつくした後、Linuxが強制的に再起動してしまいました。

お礼日時:2009/07/28 04:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!