复制代码
package jvm;
public class Crash {
public static void main(String[] args) {
// Object[] o = {“abc”};初始值赋值,不会有影响。
Object[] o = null;
while (true) {
o = new Object[] { o };
// 输出的话,jvm就不会崩溃。
// System.out.println(o);
}
}
}
复制代码
如果我直接运行这个程序,等了好久也没有出现下面的异常,因为什么和那个兄台的结果不一样,答案很简单就是我们的环境不一样,jvm的运行参数也不一样:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at jvm.Crash.main(Crash.java:10)
下面看一下在我执行这段代码什么都不加的情况下的jps的监控信息:
C:\Users\Think>jps -v
7888 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Dosgi.requiredJavaVe
rsion=1.6 -Xms40m -Xmx512m -XX:MaxPermSize=256m
7772 Jps -Dapplication.home=E:\Program Files\Java\jdk1.7.0_40 -Xms8m
7108 Crash -Dfile.encoding=UTF-8
其中这条记录7108 Crash -Dfile.encoding=UTF-8就是我们执行的程序,在下面也看到了有4个垃圾回收的线程在进行内存回收,并没有指定heap和stack的大小,使用的都是默认值,我觉得我可以用这个程序出抛出stack和heap的异常,下面我把
虚拟机运行的堆的参数改小了,改成5M吧:具体方法查看我的这篇从内存溢出看
Java 环境中的内存结构。
执行,出现了如下问题,
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at jvm.Crash.main(Crash.java:10)
可以在sun的网站上找到这个Bug的原因以及解决办法:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.
html,大概意思就是我花了太多的时间(98%),但是回收的垃圾太少了(2%)。
he concurrent 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参数以后通过jps命令查看参数:
出现:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at jvm.Crash.main(Crash.java:10)
加上输出语句以后代码如下:
复制代码
public class Crash {
public static void main(String[] args) {
// Object[] o = {“abc”};初始值赋值,不会有影响。
Object[] o = null;
while (true) {
o = new Object[] { o };
// 输出的话,jvm就不会崩溃。
System.out.println(o);
}
}
}
复制代码
再次执行程序,参数没有变化,结果依然出现异常:
复制代码
[Ljava.lang.Object;@72e0726b
[Ljava.lang.Object;@63c6472d
[Ljava.lang.Object;@5c71c17e
[Ljava.lang.Object;@786aa48e
[Ljava.lang.Object;@437f3fe
[Ljava.lang.Object;@725d61a4
[Ljava.lang.Object;@402b2861
[Ljava.lang.Object;@94dc811
[Ljava.lang.Object;@7e6d0650
[Ljava.lang.Object;@4d5f4924
[Ljava.lang.Object;@20c88c8a
[Ljava.lang.Object;@57d74d5f
[Ljava.lang.Object;@3f8d2560
[Ljava.lang.Object;@1b663c05
[Ljava.lang.Object;@2046942e
[Ljava.lang.Object;@184bcffd
[Ljava.lang.Object;@1b97d23c
[Ljava.lang.Object;@6207775d
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.(Unknown Source)
at java.lang.Integer.toUnsignedString(Unknown Source)