国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入理解OutOfMemoryError

    當(dāng)堆棧跟蹤信息里面出現(xiàn)OutOfMemoryError的時候,你應(yīng)該很清楚發(fā)生了什么。應(yīng)用程序由于沒有足夠的內(nèi)存空間所以掛了。知道這個一般就也夠了,但是對于構(gòu)建和維護應(yīng)用程序的人來說,要想查清楚為什么報錯的話,這里倒可以再多分享一點經(jīng)驗。

    在這篇文章里面,我們主要介紹一下不同的OutOfMemoryError具體是什么含義。我們先從最簡單的例子開始,后面會有一些更有意思的話題。

Java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError: unable to create new native thread java.lang.OutOfMemoryError: nativeGetNewTLA java.lang.OutOfMemoryError: Requested array size exceeds VM limit java.lang.OutOfMemoryError: request bytes for . Out of swap space? java.lang.OutOfMemoryError: (Native method)

java.lang.OutOfMemoryError: Java heap space。
    我們先從大家都見過卻并不喜聞樂見的開始。這是Java虛擬機在抱怨堆里面已經(jīng)沒有更多的空間了。你正準(zhǔn)備創(chuàng)建一個新的對象,但是這個要創(chuàng)建的對象需要的內(nèi)存已經(jīng)超過了虛擬機所剩的了。虛擬機會嘗試通過full GC來回收內(nèi)存,如果不行的話,就會拋出這個信息。解決這個問題最快的方法就是通過-Xmx參數(shù)來增加堆的大小。注意,本文中的建議需要有保留的接受。很多時候可能你就不了了之了,卻不去找出問題的根源。

    下一個問題也很常見。我相信很多人在重新部署的時候 都遇見過

    java.lang.OutOfMemoryError: PermGen space
。這個和第一個現(xiàn)象差不多,不過這里準(zhǔn)備分配內(nèi)存的空間是持久代。同樣的,你的空間已經(jīng)不夠了,所以虛擬機善意的提醒了你一下。如果你增加了-XX:MaxPermSize這個參數(shù)的值的話,這個問題通常就解決了。

    第三個,java.lang.OutOfMemoryError: GC overhead limit exceeded,這個問題有點特殊。這里沒有提示說堆還是持久代有問題,虛擬機只是告訴你你的程序花在垃圾回收上的時間太多了,卻沒有什么見效。默認(rèn)的話,如果你98%的時間都花在GC上并且回收了才不到2%的空間的話,虛擬機才會拋這個異常。這是一個快速失敗的安全保障的很好的實踐。一般來說禁用它也沒有太大用處,如果需要的話你可以把-XX:-UseGCOverheadLimit加到啟動腳本里。

    在我們使用Plumbr解決的問題中,前三個例子覆蓋了98%以上的場景。因此下面這幾個你很有可能不太清楚。

java.lang.OutOfMemoryError: unable to create new native thread,如果虛擬機正在請求操作系統(tǒng)創(chuàng)建一個本地線程,而操作系統(tǒng)無法創(chuàng)建的時候,你會收到這個報錯信息。這個限制的大小跟平臺相關(guān),如果你對這個限制的大小好奇的話,可以用下面這小段代碼做下試驗。在我的64位的Mac OSX上使用最新的JDK7,當(dāng)創(chuàng)建的線程到2032時的就會報錯。

while(true){    new Thread(new Runnable(){        public void run() {            try {                Thread.sleep(10000000);            } catch(InterruptedException e) { }                }       }).start();}

java.lang.OutOfMemoryError: nativeGetNewTLA指當(dāng)虛擬機不能分配新的線程本地空間(Thread Local Area)的時候錯誤信息。這個異常只有在jRockit虛擬機時才會碰到。線程本地空間是多線程程序里面為了更有效的進行內(nèi)存分配而建立的緩存。每一個線程都有一份自己的緩存,當(dāng)這個線程要創(chuàng)建對象的時候,就在這上面分配。如果你有很多線程同時并發(fā),又要創(chuàng)建大量的對象,可能會出現(xiàn)這個問題,這種情況下你可以調(diào)整一下-XXtlaSize這個參數(shù)。

java.lang.OutOfMemoryError: Requested array size exceeds VM limit
,當(dāng)你正準(zhǔn)備創(chuàng)建一個超過虛擬機允許的大小的數(shù)組時,這條錯誤就會出現(xiàn)在你眼前。在我的64位Mac系統(tǒng)上的最新的JDK7,我發(fā)現(xiàn)如果數(shù)組的長度是Integer.MAXINT-2的時候,是正常的,但只要再增加一個,也就是Integer.MAXINT-1,就成為那最后一根稻草了。在老的32位機器上,由于堆比較小,限制數(shù)組的大小是有好處的。不過在現(xiàn)代的64位機器上感覺有點多余。

java.lang.OutOfMemoryError: request bytes for . Out of swap space?
這個錯誤是當(dāng)虛擬機向本地操作系統(tǒng)申請內(nèi)存失敗時拋出的。這和你用完了堆或者持久化中的內(nèi)存的情況有些不同。這個錯誤通常是在你的程序已經(jīng)逼近平臺限制的時候產(chǎn)生的。這個信息告訴你的是你可能已經(jīng)用光了物理內(nèi)存以及虛擬內(nèi)存了。由于虛擬內(nèi)存通常是用磁盤作為交換分區(qū),因此你最先想到的解決方法可能是先增加交換分區(qū)的大小。不過我從沒見過一個程序在頻繁進行內(nèi)存交換還能正常運行的,所以這個方法可能不會起到什么作用。

java.lang.OutOfMemoryError: (Native method)
,現(xiàn)在是時候找你開發(fā)C語言的小伙伴請求幫助了。因為現(xiàn)在你看到的錯誤信息是來自本地代碼的,相對于剛才的出錯信息,這次異常是在JNI或者 本地方法中檢測到的,而不是在虛擬機執(zhí)行的代碼中。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jvm內(nèi)存調(diào)優(yōu)經(jīng)驗總結(jié)
關(guān)于java堆內(nèi)存溢出的幾種情況
某團面試題:JVM 堆內(nèi)存溢出后,其他線程是否可繼續(xù)工作?
JAVA的內(nèi)存模型及結(jié)構(gòu) | 并發(fā)編程網(wǎng)
JAVA面試解析(有贊二面)
java 虛擬機--新生代與老年代GC
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服