這篇文章主要介紹Tomcat運(yùn)行Java Web內(nèi)存溢出的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為普定企業(yè)提供專業(yè)的網(wǎng)站制作、做網(wǎng)站,普定網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
如果JVM里運(yùn)行的程序, 它的內(nèi)存堆和持久存儲區(qū)域的都滿了,這個時候程序還想創(chuàng)建對象實(shí)例的話,垃圾收集器就會啟動,試圖釋放足夠的內(nèi)存來創(chuàng)建這個對象。這個時候如果垃圾收集器 沒有能力釋放出足夠的內(nèi)存,它就會拋出OutOfMemoryError內(nèi)存溢出錯誤。
SUN JVM的內(nèi)存管理方式:
SUN的JVM是類似人類家族,也就是在一個地方創(chuàng)建對象,在它長期占據(jù)空間之前給它多次死亡的機(jī)會,SUN JVM會劃分為:
1. 年輕的一代(Young generation),包括EDEN和2個幸存者空間(出發(fā)地和目的地the From space and the To space)
2. 老一代(Old generation)
3. ***的一代(Permanent generation)
Java虛擬機(jī)的運(yùn)行時數(shù)據(jù)區(qū)一般分類如下(不一定是物理劃分):
1. 堆:主要存放對象實(shí)例,線程共享
2. 棧:主要存儲特定線程的方法調(diào)用狀態(tài),線程獨(dú)占
3. 本地方法棧:存儲本地方法的調(diào)用狀態(tài),線程獨(dú)占
4. PC寄存器:學(xué)過操作系統(tǒng)課程的都知道,線程獨(dú)占
5. 方法區(qū):主要存儲了類型信息,線程共享
因此,在拋出內(nèi)存溢出錯誤的時候,一般都會提示內(nèi)存泄露的種類,一般也都是按照區(qū)域進(jìn)行劃分:
1. 堆(heap)內(nèi)存泄漏java.lang.OutOfMemoryError: Javaheap space:大家都比較熟悉 ,通過設(shè)置-Xms2048m -Xmx4096m可以解決
2. 棧(stack)內(nèi)存泄漏:當(dāng)前線程運(yùn)行期間維護(hù)的中間變量等信息過多,例如常見的死循環(huán)引起stack over flow
3. 方法區(qū)(permanent heap)內(nèi)存泄漏,即java.lang.OutOfMemoryError: PermGen space:發(fā)生的原因和類型裝載、類型卸載有直接的關(guān)系,通過設(shè)置-XX:MaxNewSize=256m -XX:MaxPermSize=256m可以解決。
一般情況下,當(dāng)服務(wù)器內(nèi)存過小,而提供了大量的訪問服務(wù)時,可能會緩存過多的數(shù)據(jù)對象造成堆內(nèi)存溢出,當(dāng)web應(yīng)用不斷擴(kuò)大,加載的lib庫達(dá)到一定大?。?M)后,就容易報PermGen OOM,也就是方法區(qū)溢出。
在Linux服務(wù)器中將參數(shù)寫入環(huán)境變量:
export CATALINA_OPTS="-Xms2048m -Xmx4096m" export JAVA_OPTS="-XX:MaxNewSize=256m -XX:MaxPermSize=256m"
Xmx ***不要超過服務(wù)器物理內(nèi)存的80%
以上是“Tomcat運(yùn)行Java Web內(nèi)存溢出的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!