Java視頻教程之Java程序在什么情形下會(huì)掛掉
小編想問(wèn)一下大家知不知道Java程序在什么情形下會(huì)掛掉?有哪些小伙伴曾經(jīng)碰到過(guò)Java程序掛掉的情況?本篇文章扣丁學(xué)堂Java培訓(xùn)機(jī)構(gòu)小編就和讀者們一塊來(lái)看一下這個(gè)問(wèn)題。

在本例中,先初始化了一個(gè)map,然后用一個(gè)無(wú)限循環(huán)將一些鍵值對(duì)插入到map里面:
classWrapper{
publicstaticvoidmain(Stringargs[])throwsException{
Mapmap=System.getProperties();
Randomr=newRandom();
while(true){
map.put(r.nextInt(),"value");
}
}
}
你可能也猜到了,這段代碼編譯執(zhí)行后無(wú)法正常結(jié)束。當(dāng)我用這組參數(shù)啟動(dòng)的話(huà):
java-Xmx100m-XX:+UseParallelGCWrapper
我會(huì)在終端中看到j(luò)ava.lang.OutOfMemoryError:GCoverheadlimitexceeded的異常信息。不過(guò)如果我調(diào)整一下堆大小或者是GC的類(lèi)型的話(huà),在我的MacOSX10.9.2系統(tǒng)上用OracleHotspotJDK1.7.0_45來(lái)運(yùn)行,就會(huì)出現(xiàn)不同的情況。
比如說(shuō),我用一個(gè)較小的堆來(lái)運(yùn)行這個(gè)程序,就像下面這樣:
java-Xmx10m-XX:+UseParallelGCWrapper
應(yīng)用程序會(huì)拋出一段大家更熟悉的錯(cuò)誤信息然后掛掉:java.lang.OutOfMemoryError:Javaheapspace。
如果你換成ParallelGC以外的GC策略的話(huà),比如說(shuō)-XX:+UseConcMarkSweepGCor-XX:+UseG1GC,你將會(huì)看到由默認(rèn)的異常處理器所拋出的異常,并且你看不到堆棧信息了,因?yàn)槎岩呀?jīng)沒(méi)有空間了,甚至連異常的堆棧信息都沒(méi)法填充了,因此它在創(chuàng)建異常的時(shí)候就掛掉了:
MyPrecious:examplesvladimir$java-Xmx100m-XX:+UseConcMarkSweepGCWrapper
Exception:java.lang.OutOfMemoryErrorthrownfromtheUncaughtExceptionHandlerinthread"main"
這說(shuō)明了什么?當(dāng)資源緊缺的時(shí)候,你根本沒(méi)法判斷你的應(yīng)用程序是怎么掛掉的,因此不要指望能出現(xiàn)你所預(yù)期的一系列錯(cuò)誤提示。從上面這個(gè)例子中可以看到,你的程序可能會(huì)以三種完全不同的方式掛掉:
GC的安全性檢查失敗:一旦GC花費(fèi)的時(shí)間占到98%以上的話(huà),JVM就會(huì)宣告投降了:java.lang.OutOfMemoryError:GCoverheadlimitexceeded。
無(wú)法為下一個(gè)操作分配足夠的內(nèi)存:如果無(wú)法滿(mǎn)足下一條指令所需要分配的內(nèi)存的話(huà),你會(huì)收到一條”java.lang.OutOfMemoryError:Javaheapspace”的錯(cuò)誤信息。
你可能也總結(jié)出來(lái)了,還有一種情況是你的內(nèi)存已經(jīng)緊張到連JVM創(chuàng)建一條OutOfMemoryError異常,填充堆棧信息,打印到屏幕上這點(diǎn)要求都滿(mǎn)足不了了。這種情況UncaughtExceptionHandler會(huì)捕獲到這個(gè)錯(cuò)誤,而不再走通常的錯(cuò)誤流程。這個(gè)處理器恰如其名,當(dāng)線(xiàn)程由于某個(gè)異常快要掛掉的時(shí)候,它開(kāi)始出來(lái)收?qǐng)隽恕3霈F(xiàn)這種情況的話(huà),JVM會(huì)找到線(xiàn)程對(duì)應(yīng)的UncaughtExceptionHandler,然后調(diào)用它的uncaughtException方法。
好了,Java程序在什么情形下會(huì)掛掉相信大家已經(jīng)有所了解了,想要了解Java方面更多信息的話(huà)可以登錄扣丁學(xué)堂官網(wǎng)了解,扣丁學(xué)堂不僅有專(zhuān)業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Java視頻教程供學(xué)員觀看學(xué)習(xí)哦,想要觀看Java視頻教程的小伙伴快快登錄扣丁學(xué)堂吧。扣丁學(xué)堂Java技術(shù)交流群:850353792。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
紅外熱像儀相關(guān)文章:紅外熱像儀原理










