分析java内存溢出

代码如下:

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);}

注:此文假设代码没有问题。

1:关于java栈的内存溢出 1.1:java.lang.StackOverflowError

此内存溢出说明,java栈的设置太小,我们可以借助-Xss这个参数模拟一下此异常,-Xss是用来设置栈的大小。右键 run as configurations,如下图:

然后应用,然后run,我们发现控制台报错,如下:

count:892  size:892count:893  size:893count:894  size:894Exception in thread "main" java.lang.StackOverflowErrorat 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:1925count:1926  size:1926count:1927  size:1927count:1928  size:1928Exception in thread "main" java.lang.StackOverflowErrorat 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的值增大了不少。

1.2:java.lang.OutOfMemoryError: unable to create new native thread

此异常说明,java栈的值设置的太大,以至于在创建线程,分配栈内存的时候发现系统内存小于设置的栈内存大小。我们可以按照上面的运行方式把-Xss的值设置成500m,如果你的电脑设置成500m后没有报错,那么就继续增大。我们看下控制台输出,如下:

Error occurred during initialization of VMjava.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:597)at java.lang.ref.Finalizer.<clinit>(Finalizer.java:176)

2:java堆的内存溢出 2.1:java.lang.OutOfMemoryError: Java heap space

此异常说明java堆设置的太小,我们可以用-Xms和-Xmx来设置。具体就不再这里说明了。

而在于当时的那份心情。可是旅行的彼时那刻我的心情一直是好的吗?

分析java内存溢出

相关文章:

你感兴趣的文章:

标签云: