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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值