尝试解答java内存问题(二)
at java.lang.Integer.toHexString(Unknown Source)
at java.lang.Object.toString(Object.java:237)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at jvm.Crash.main(Crash.java:12)
复制代码
输出的时候将上面的日志内容省略了一部分。接下来是第二个例子,要知道在堆中保存的是对象的实例,在例子中:
JvmBean j = null;
while (true) {
j = new JvmBean(j);
// 无论输出不输出,jvm都会崩溃
// System.out.println(j);
}
很显然和第一个Object的例子不一样,看着JbmBean的定义:
复制代码
package jvm;
public class JvmBean {
JvmBean bean = new JvmBean(this);
public JvmBean(JvmBean bean){
this.bean = bean;
}
复制代码
就知道这个程序跟门就没有循环,在第一次进到循环的时候就挂了。// System.out.println(j);这句根本就执行不到。OK,我帮你修改一下:把Jvm类改为如下:
复制代码
public class JvmBean {
JvmBean bean = null;
public JvmBean(JvmBean bean) {
System.out.println(1);
this.bean = bean;
}
}
复制代码
然后改一下JVM的运行参数:
运行结果如下:
复制代码
public class JvmBean {
JvmBean bean = null;
public JvmBean(JvmBean bean) {
System.out.println(1);
this.bean = bean;
}
}
复制代码
所以我猜测你在第二个例子自己写的类中抛出的异常应该不是你想象中的场景。