分享

如何用java编写代码让java虚拟机崩溃

 Levy_X 2017-06-16

如何用java编写代码让java虚拟机崩溃

来自 匿名用户 的提问

最佳答案
由提问者推荐

  • 网上有这样一套编码,能使java虚拟机崩溃:
    packagejvm;
    publicclassCrash{
    publicstaticvoidmain(String[]args){
    //Object[]o={“abc”};初始值赋值,不会有影响。
    Object[]o=null;
    while(true){
    o=newObject[]{o};
    //输出的话,jvm就不会崩溃。
    //System.out.println(o);
    }
    }
    }程序运行十几秒之后,控制台会出现这样的错误:
    Exceptioninthread'main'java.lang.OutOfMemoryError:Javaheapspace
    atjvm.Crash.main(Crash.java:10)很明显,超出内存空间错误。
    我将原程序随意改了一下,如赋初始值等,对程序无影响。
    可是我将死循环中的o输出在控制台的时候,jvm居然一直都不崩,为什么输出的话,就不会超出内存空间呢?
    我看来,原程序能够使Jvm崩溃,是因为死循环中,通过旧对象,不断创建出新的对象,即创造的对象是互相引用的,所以GC是不会回收它们的,造成堆栈溢出。
    仿照这个例子,我写了一个简单的类,模仿例子程序中的数组,如下:
    packagejvm;
    publicclassMyCrash{
    publicstaticvoidmain(String[]args){
    JvmBeanj=null;
    while(true){
    j=newJvmBean(j);
    //无论输出不输出,jvm都会崩溃
    //System.out.println(j);
    }
    }
    }结果便是控制台输出如下的错误:
    Exceptioninthread'main'java.lang.StackOverflowError
    atjvm.JvmBean.(JvmBean.java:5)
    atjvm.JvmBean.(JvmBean.java:5)
    atjvm.JvmBean.(JvmBean.java:5)
    atjvm.JvmBean.(JvmBean.java:5)
    atjvm.JvmBean.(JvmBean.java:5)一长串的'at jvm.JvmBean.(JvmBean.java:5)',后面的被省略了。
    结果看来,同样也造成了jvm崩溃,可是错误类型跟例子程序的不同,说堆栈溢出错误,并且无论是否输出,错误都一样发生,为什么呢?
    结论
    第一个异常
    Exception in thread 'main' java.lang.OutOfMemoryError: Java heap spaceat jvm.Crash.main(Crash.java:10)是因为程序无法申请到足够的内存的时候抛出的异常,Object数组o不断指向新的Object数组,数组元素是原来的Object数组,这使得Object维数越来越高。不断申请内存空间,最终导致超出jvm中堆的最大值。堆内存溢出。为什么输出打印,时间会延长呢?!输出打印的话,虚拟机并不是不会崩溃,而是崩溃的时间大大延长了。而崩溃时间延长其实是假象,是因为输出属于IO事件,每次输出CPU都被中断,IO很耗时,所以,感觉上才会时间延长。
    第二个异常
    ”类内部的静态属性 静态块 对象属性 构造方法。注意这一点,那就是说bean属性会先于JvmBean的构造函数被初始化。在main函数中,new一个JvmBean的构造函数之前,类内部的JvmBean对象要优先被初始化,这个类内部的属性bean的内部同样也包含了一个JvmBean对象需要被初始化,成循环调用,造成了栈溢出。”所以异常才会是这个——Exception in thread 'main' java.lang.StackOverflowError

    匿名用户

    2017-03-28

    0

    4

    0

就医指南_

广告

前往了解治疗方法
-

相关推荐

  • 运行Java虚拟机时,Class、Runtime、Object这三个类具体是怎么个执行...

    468

    略懂社

    1 回答

  • java虚拟机具体怎么用

    0

    搜狗问问

    1 回答

  • 运行java及java虚拟机需要什么配置

    0

    搜狗问问

    1 回答

  • java编译器和java虚拟机的关系??

    23

    搜狗问问

    1 回答

  • 请问如何更新java虚拟机?

    0

    搜狗问问

    3 回答

  • 什么是Java虚拟机?Java虚拟机使用方法?

    0

    搜狗问问

    3 回答

    相关搜索

    略懂社热议

      本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多