分析java内存溢出

来源:互联网 发布:ubuntu软件下载 编辑:程序博客网 时间:2024/06/03 00:32

代码如下:

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来设置。具体就不再这里说明了。

原创粉丝点击