代码如下:
private static Test [] test = null; public static void test(int count){ if(count<10000000){ count++; test = new Test[count]; } System.out.println("count:"+count+" size:"+test.length); test(count); } public static void main(String... args){ test(0); }
注:此文假设代码没有问题。
此内存溢出说明,java栈的设置太小,我们可以借助-Xss这个参数模拟一下此异常,-Xss是用来设置栈的大小。右键 run as configurations,如下图:
然后应用,然后run,我们发现控制台报错,如下:
count:892 size:892 count:893 size:893 count:894 size:894 Exception in thread "main" java.lang.StackOverflowError at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58) at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392) at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)
我们可以看到到894次的时候,报错了。我们可以更改-Xss的值,为-Xss100k然后再运行一次,输入如下:
count:1925 size:1925 count:1926 size:1926 count:1927 size:1927 count:1928 size:1928Exception in thread "main" java.lang.StackOverflowError at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58) at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392) at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)
很明显count的值增大了不少。
此异常说明,java栈的值设置的太大,以至于在创建线程,分配栈内存的时候发现系统内存小于设置的栈内存大小。我们可以按照上面的运行方式把-Xss的值设置成500m,如果你的电脑设置成500m后没有报错,那么就继续增大。我们看下控制台输出,如下:
Error occurred during initialization of VM java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:597) at java.lang.ref.Finalizer.<clinit>(Finalizer.java:176)
此异常说明java堆设置的太小,我们可以用-Xms 和-Xmx来设置。具体就不再这里说明了。