import java.util.Arrays;
import java.util.Random;
public class test01 {
public static void main(String[] args) {
long[] nums = new Random().longs(100_000_000,-200L,200L).toArray();
System.out.println("nums[0]="+nums[0]);
System.out.println("nums[99_999_999]="+nums[99_999_999]);
}
}
環境
ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)
解説
-200から200までの乱数を1億生成して配列numsに格納して、nums[0]とnums[99_999_999]を出力する。
実行すると、「OutOfMemoryError」ってエラーが出た。
エラーを出さない対策は、-Xmxを使うと回避できるらしい。
私の環境では-Xmx1144mでエラーが出て、-Xmx1145mで正常に動いた。
JAVA SE8からrandomクラスにint,long,doubleの乱数列からなるストリームを生成するメソッドが追加された。
longsメソッドの第1引数ではストリームの要素数、第2引数と第3引数で生成する乱数の範囲を設定している。
-200Lと200LのLはlong型であることを示す。
実行結果
c:\2015>java test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
at java.util.stream.Nodes.longBuilder(Unknown Source)
at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)
at java.util.stream.LongPipeline.toArray(Unknown Source)
at test01.main(test01.java:7)
c:\2015>java -Xmx1144m test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
at java.util.stream.Nodes.longBuilder(Unknown Source)
at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)
at java.util.stream.LongPipeline.toArray(Unknown Source)
at test01.main(test01.java:7)
c:\2015>java -Xmx1145m test01
nums[0]=-50
nums[99_999_999]=-94
あとがき
おそらく、実行するパソコンによって-Xmx1145mでは動かないかな?あるいは、もっと少ないメモリ量でいけるか?
OutOfMemoryはJava VMの管理するメモリサイズを超えたことを意味し、「実行環境依存」ということだが、「実行環境依存」ってのがよくわからない。いまのとこはこの「実行環境依存」を掘り下げずに飛ばして勉強していこう。
このXmxの使い方が分からず半日つぶしてしまったが、エラーが出ずに実行できたときは感動ものだな。
JAVAは挫折して丸投げしたまんまだったが、今年、2015年にJAVAをある程度できるレベルにしたい。
参考文献
日経ソフトウェア 2014年10月号(日経BP社) P138~139