个人觉得很适合做面试题的一个东东

 java.lang.OutOfMemoryError: Java heap space 和 Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 区别?
问题提出:
公司使用到memcache,最近一个业务老是出现memcache超时的情况,我们怀疑是value的大小超过了memcache value的maxsize之后就会超时,
但是又不确定,所以决定写一段程序测试一下,如下:
List<String> testList = new LinkedList<String>();
		String s = "这是一个测试数据";
		for(Long i=0L;i<Long.MAX_VALUE;i++){
			testList.add(s);
		}
		cache.set("testStr", testList);
		List<String> testList1 = cache.get("testStr");
		for(String str : testList1){
			System.out.println("------>"+str);
		}

本来是想看看这样会不会导致cache get的时候抛出超时的异常,结果是抛出了一个Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded,我当时想为什么没有抛出java.lang.OutOfMemoryError: Java heap space 呢?于是又对这两个异常google了一下,
java.lang.OutOfMemoryError: Java heap space:
“So – the “ java.lang.OutOfMemoryError: Java heap space ” error will be triggered when you try to add more data into the heap space area, but there is not enough room for it .”
从上面的文字看,这主要是分配堆空间发现没有堆空间可以分配的时候抛出的异常,那么,Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 呢?
The “java.lang.OutOfMemoryError: GC overhead limit exceeded” error means that GC has been trying to free the memory but is pretty much unable to get any job done. By default it happens when the JVM is spending more than 98% of the total time in GC. In addition, after GC less than 2% of the heap is recovered.
从上面的文字可以看出,抛出这个异常是在GC的时候,JVM花了大部分(>98%)的时间去做GC操作而且只有少部分的GC(<2%)操作成功了,在这样的情况下,JVM为了避免出现OutOfMemory的情况,提前抛出了一个异常,告诉Application GC操作持续失败了,为了避免内存溢出,我们只能抛出这么一个异常,这是我所有能做的了。
那么,这里为什么会出现GC持续失败呢?
我们分析一下代码,这里只有一个list对象,然后里面存了一堆的string引用,然后因为这里要循环Long.MAX_VALUE次(9223372036854775807),这明显循环到一定时候会出现内存不够用的情况,这个时候GC就试图去回收内存,但是因为这里的string应用是属于list的,而这个list还处于活跃状态,所以回收会失败,持续失败就会抛出这个异常了。那么这里为什么没有抛出 java.lang.OutOfMemoryError: Java heap space 这个异常呢?这是因为这里List只有一个,里面存的是str的引用,而引用本身是不在堆空间里面的,“这是一个测试数据”也是在常量池里面而不是堆上,所以这里并没有堆空间不够用的情况,所以不会抛出这个异常。

未完待续。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值