日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

如何用java編寫代碼讓java虛擬機(jī)崩潰

 Levy_X 2017-06-16

如何用java編寫代碼讓java虛擬機(jī)崩潰

來自 匿名用戶 的提問

最佳答案
由提問者推薦

  • 網(wǎng)上有這樣一套編碼,能使java虛擬機(jī)崩潰:
    packagejvm;
    publicclassCrash{
    publicstaticvoidmain(String[]args){
    //Object[]o={“abc”};初始值賦值,不會(huì)有影響。
    Object[]o=null;
    while(true){
    o=newObject[]{o};
    //輸出的話,jvm就不會(huì)崩潰。
    //System.out.println(o);
    }
    }
    }程序運(yùn)行十幾秒之后,控制臺(tái)會(huì)出現(xiàn)這樣的錯(cuò)誤:
    Exceptioninthread'main'java.lang.OutOfMemoryError:Javaheapspace
    atjvm.Crash.main(Crash.java:10)很明顯,超出內(nèi)存空間錯(cuò)誤。
    我將原程序隨意改了一下,如賦初始值等,對(duì)程序無影響。
    可是我將死循環(huán)中的o輸出在控制臺(tái)的時(shí)候,jvm居然一直都不崩,為什么輸出的話,就不會(huì)超出內(nèi)存空間呢?
    我看來,原程序能夠使Jvm崩潰,是因?yàn)樗姥h(huán)中,通過舊對(duì)象,不斷創(chuàng)建出新的對(duì)象,即創(chuàng)造的對(duì)象是互相引用的,所以GC是不會(huì)回收它們的,造成堆棧溢出。
    仿照這個(gè)例子,我寫了一個(gè)簡(jiǎn)單的類,模仿例子程序中的數(shù)組,如下:
    packagejvm;
    publicclassMyCrash{
    publicstaticvoidmain(String[]args){
    JvmBeanj=null;
    while(true){
    j=newJvmBean(j);
    //無論輸出不輸出,jvm都會(huì)崩潰
    //System.out.println(j);
    }
    }
    }結(jié)果便是控制臺(tái)輸出如下的錯(cuò)誤:
    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)一長(zhǎng)串的'at jvm.JvmBean.(JvmBean.java:5)',后面的被省略了。
    結(jié)果看來,同樣也造成了jvm崩潰,可是錯(cuò)誤類型跟例子程序的不同,說堆棧溢出錯(cuò)誤,并且無論是否輸出,錯(cuò)誤都一樣發(fā)生,為什么呢?
    結(jié)論
    第一個(gè)異常
    Exception in thread 'main' java.lang.OutOfMemoryError: Java heap spaceat jvm.Crash.main(Crash.java:10)是因?yàn)槌绦驘o法申請(qǐng)到足夠的內(nèi)存的時(shí)候拋出的異常,Object數(shù)組o不斷指向新的Object數(shù)組,數(shù)組元素是原來的Object數(shù)組,這使得Object維數(shù)越來越高。不斷申請(qǐng)內(nèi)存空間,最終導(dǎo)致超出jvm中堆的最大值。堆內(nèi)存溢出。為什么輸出打印,時(shí)間會(huì)延長(zhǎng)呢?!輸出打印的話,虛擬機(jī)并不是不會(huì)崩潰,而是崩潰的時(shí)間大大延長(zhǎng)了。而崩潰時(shí)間延長(zhǎng)其實(shí)是假象,是因?yàn)檩敵鰧儆贗O事件,每次輸出CPU都被中斷,IO很耗時(shí),所以,感覺上才會(huì)時(shí)間延長(zhǎng)。
    第二個(gè)異常
    ”類內(nèi)部的靜態(tài)屬性 靜態(tài)塊 對(duì)象屬性 構(gòu)造方法。注意這一點(diǎn),那就是說bean屬性會(huì)先于JvmBean的構(gòu)造函數(shù)被初始化。在main函數(shù)中,new一個(gè)JvmBean的構(gòu)造函數(shù)之前,類內(nèi)部的JvmBean對(duì)象要優(yōu)先被初始化,這個(gè)類內(nèi)部的屬性bean的內(nèi)部同樣也包含了一個(gè)JvmBean對(duì)象需要被初始化,成循環(huán)調(diào)用,造成了棧溢出?!彼援惓2艜?huì)是這個(gè)——Exception in thread 'main' java.lang.StackOverflowError

    匿名用戶

    2017-03-28

    0

    4

    0

就醫(yī)指南_

廣告

前往了解治療方法
-

相關(guān)推薦

  • 運(yùn)行Java虛擬機(jī)時(shí),Class、Runtime、Object這三個(gè)類具體是怎么個(gè)執(zhí)行...

    468

    略懂社

    1 回答

  • java虛擬機(jī)具體怎么用

    0

    搜狗問問

    1 回答

  • 運(yùn)行java及java虛擬機(jī)需要什么配置

    0

    搜狗問問

    1 回答

  • java編譯器和java虛擬機(jī)的關(guān)系??

    23

    搜狗問問

    1 回答

  • 請(qǐng)問如何更新java虛擬機(jī)?

    0

    搜狗問問

    3 回答

  • 什么是Java虛擬機(jī)?Java虛擬機(jī)使用方法?

    0

    搜狗問問

    3 回答

    相關(guān)搜索

    略懂社熱議

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多