概述
代码如下:
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: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的值增大了不少。
1.2:java.lang.OutOfMemoryError: unable to create new native thread
此异常说明,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)
2:java堆的内存溢出
2.1:java.lang.OutOfMemoryError: Java heap space
此异常说明java堆设置的太小,我们可以用-Xms 和-Xmx来设置。具体就不再这里说明了。
最后
以上就是温柔冥王星为你收集整理的分析java内存溢出1:关于java栈的内存溢出2:java堆的内存溢出的全部内容,希望文章能够帮你解决分析java内存溢出1:关于java栈的内存溢出2:java堆的内存溢出所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复