メモリを拘束するユーティリティ
メモリを拘束してOutOfMemoryErrorをスローする&スローしやすい状態を作るユーティリティです。テスト用に作りました。
- hold()でOutOfMemoryErrorが発生するまでメモリを拘束し、OutOfMemoryErrorをスローします。
- スローした後もメモリは拘束された状態のままです。
- release()で拘束したメモリを解放します。
import java.util.ArrayList; import java.util.List; /** * メモリを拘束するユーティリティ * * @version $Revision:$ * @author $Author:$ */ public class MemoryHolder { /**拘束したメモリ*/ private List<byte[]> memory = new ArrayList<byte[]>(); /** * {@link OutOfMemoryError}が発生するまでメモリを拘束する。<br/> * メソッドから復帰した後も、{@link #release()}が実行されるまで、拘束されたままとなる。 * @throws OutOfMemoryError メモリ不足 */ public void hold() throws OutOfMemoryError { while ( true ) { byte[] b = new byte[256]; for (int i = 0; i < b.length; i++){ b[i] = Byte.MAX_VALUE; } memory.add( b ); } } /** * {@link #hold()}で拘束したメモリを解放する。 */ public void release() { memory = new ArrayList<byte[]>(); } }
サンプル。
public static void main( String[] args ) throws InterruptedException { MemoryHolder m = new MemoryHolder(); showFreeMemory(); // 余裕有り try { m.hold(); // メモリを拘束 } catch ( OutOfMemoryError e ) {} showFreeMemory(); // 余裕なし m.release(); // 解放 System.gc(); // 一応GC Thread.sleep( 2000 ); // GCされるのを待つ showFreeMemory(); // 余裕有り / 割り当て最大値まで領域が拡張されているため、初回より多い。 } private static void showFreeMemory() { System.out.println( Runtime.getRuntime().freeMemory()); }
実行結果です。
4850032 376 62277752