如何用虚拟机编写java程序吗1
发布网友
发布时间:2023-11-04 12:43
我来回答
共1个回答
热心网友
时间:2024-11-16 10:23
网上有这样一套编码,能使java虚拟机崩溃:
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); } }}
程序运行十几秒之后,控制台会出现这样的错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at jvm.Crash.main(Crash.java:10)
很明显,超出内存空间错误。
我将原程序随意改了一下,如赋初始值等,对程序无影响。
可是我将死循环中的o输出在控制台的时候,jvm居然一直都不崩,为什么输出的话,就不会超出内存空间呢?
我看来,原程序能够使Jvm崩溃,是因为死循环中,通过旧对象,不断创建出新的对象,即创造的对象是互相引用的,所以GC是不会回收它们的,造成堆栈溢出。
仿照这个例子,我写了一个简单的类,模仿例子程序中的数组,如下:
package jvm; public class MyCrash { public static void main(String[] args) { JvmBean j = null; while(true){ j = new JvmBean(j); //无论输出不输出,jvm都会崩溃 //System.out.println(j); } }}
结果便是控制台输出如下的错误:
Exception in thread "main" java.lang.StackOverflowError at jvm.JvmBean.<init>(JvmBean.java:5) at jvm.JvmBean.<init>(JvmBean.java:5) at jvm.JvmBean.<init>(JvmBean.java:5) at jvm.JvmBean.<init>(JvmBean.java:5) at jvm.JvmBean.<init>(JvmBean.java:5)
一长串的"at jvm.JvmBean.<init>(JvmBean.java:5)",后面的被省略了。