解答例 - 実習課題2 - 1.バッファ
(実習課題2)
実習課題1のプログラムで、作成するバッファサイズを増加させていくとOutOfMemoryErrorが発生することを確認してください。ダイレクトバッファと非ダイレクトバッファの作成の際にそれぞれエラーを発生させ、javaのオプションを指定することによりエラーを発生させないようにして下さい。
解答例
package com.techscore.nio.chapter1.subject2; import java.nio.ByteBuffer; import java.nio.IntBuffer; /** * Main.java TECHSCORE NewIO 1章 実習課題2 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ public class Main { public static void main(String[] args) { Main buff = new Main(); try { for (int i = 1; i < Integer.MAX_VALUE; i *= 10) { buff.benchMark(i); } } catch (OutOfMemoryError e) { System.out.println("OutOfMemoryErrorが発生しました。"); System.out.println(e.getMessage()); } } private void benchMark(int size) { System.out.println("サイズ\t種類\t\t時間\t"); System.out.println("‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾"); benckMark(size, true); benckMark(size, false); System.out.println("‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾"); } private void benckMark(int size, boolean bDirect) { IntBuffer buffer = null; if (bDirect) { buffer = ByteBuffer.allocateDirect(size * 4).asIntBuffer(); } else { buffer = IntBuffer.allocate(size); } long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { buffer.put(i, i); } int[] ints; boolean bOK = true; try { ints = buffer.array(); } catch (UnsupportedOperationException e) { System.out.println(e.getMessage()); return; } long end = System.currentTimeMillis(); String bufferKind = bDirect ? "ダイレクト" : "非ダイレクト"; System.out.print(size + "\t"); System.out.print(bufferKind + "\t"); System.out.println((end - start) + "msec\t"); } }