相同的测试代码,为什么jdk1.7没有内存溢出。而1.6内存溢出了。

小偷家的保安 发布于 2016/04/09 17:22
阅读 591
收藏 0

相同的测试代码,为什么jdk1.7没有内存溢出。而1.6内存溢出了。

public static void main(String[] args) {
		ArrayList<Object> list = new ArrayList<Object>();
		while(true){
			list.add(new Temp("admin", "password"));
		}
	}



堆都是设置为10m

-Xms10M -Xmx10M



加载中
0
南湖船老大
南湖船老大

-verbose:gc 不就清楚了。。

其实是会崩溃的,JVM在不停地做FULL GC,内存增长地比较慢,但最终一点一点接近极限的时候,就会崩溃的。这个极限不是10M,而是一个接近10M的大小(JVM内部本身还要占据一部分)

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

来看oracle官方文档:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.oom

Excessive GC Time and OutOfMemoryError
The parallel collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.

即使你加了-XX:-UseGCOverheadLimit选项,可以让GC无限制的运行,但是仍然会因为对空间满了而溢出。

南湖船老大
南湖船老大
回复 @小偷家的保安 : 这个细节不了解,不好说,逃:)
小偷家的保安
小偷家的保安
是不是jdk1.7的gc频率和效率优于1.6的缘故
小偷家的保安
小偷家的保安
我的意思是同样设置了10m的最小和最大堆,jdk1.6很快就oom,jdk1.7就会一直运行下去。
0
yak
yak
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Flow.main(Flow.java:8)

java1.8
0
S
Solidsnake
其实每个版本的虚拟机都是不同的, 1.7相比于1.6来说CG肯定是有所优化得了
0
zigzagroad
zigzagroad
这个测试的意义是什么
返回顶部
顶部