Java堆空间,本机堆和内存问题
最近,我在和一個(gè)朋友討論為什么Java進(jìn)程使用的內(nèi)存比啟動(dòng)Java進(jìn)程時(shí)設(shè)置的最大堆多。
代碼創(chuàng)建的所有Java對(duì)象都是在Java堆空間內(nèi)創(chuàng)建的,其大小由-Xmx選項(xiàng)定義。 但是一個(gè)Java進(jìn)程由很多空間組成,而不僅僅是Java堆空間。 以下是組成Java進(jìn)程的一些空格:
- 加載的庫(kù)(包括jar和class文件)
- Java堆的控制結(jié)構(gòu)
- 線程棧
- 生成的(JITed)代碼
- 用戶本機(jī)內(nèi)存(在JNI中分配)
- … 更多…
在32位體系結(jié)構(gòu)系統(tǒng)中,總進(jìn)程大小不能超過(guò)4GB。 因此,一個(gè)32位的Java進(jìn)程由許多空間(Java堆,本機(jī)內(nèi)存(C-Heap)和其他空間)組成,并且其分配的空間不能超過(guò)4GB。
假設(shè)在32位生產(chǎn)系統(tǒng)上長(zhǎng)時(shí)間運(yùn)行具有-Xmx 1.5 GB(Java堆設(shè)置為1.5 GB)的Java應(yīng)用程序服務(wù)器,并且已部署了許多應(yīng)用程序。 一段時(shí)間后,客戶希望在同一應(yīng)用程序服務(wù)器上部署更多應(yīng)用程序。 系統(tǒng)運(yùn)營(yíng)商了解,由于服務(wù)器將不得不處理更多的請(qǐng)求,因此還需要?jiǎng)?chuàng)建更多的對(duì)象并進(jìn)行更多的處理。 因此,作為將來(lái)的解決方案,運(yùn)營(yíng)商決定將Java進(jìn)程的最大堆增加到2 GB。
好的,這看起來(lái)是個(gè)好方法,但是實(shí)際上在此生產(chǎn)應(yīng)用程序服務(wù)器上發(fā)生了什么? (這是真實(shí)情況)。 應(yīng)用程序服務(wù)器因OutOfMemoryError崩潰! 您能考慮一下可能的原因嗎?
我的第一個(gè)想法是2 GB的內(nèi)存不足以支持所有這些應(yīng)用程序。 不幸的是,問(wèn)題出在別的地方。 您現(xiàn)在怎么看? 我會(huì)幫你一點(diǎn)。
java.lang.OutOfMemoryError: requested 55106896 bytes for Chunk::new.真正的原因是,對(duì)于本機(jī)(C-Heap)內(nèi)存,需要已部署的(舊)應(yīng)用程序太大。 在操作員增加堆大小(從1.5GB到2 GB)之前,他們沒(méi)有監(jiān)視舊應(yīng)用程序所需的本機(jī)內(nèi)存空間。 此操作的副作用是自動(dòng)將Java進(jìn)程本機(jī)內(nèi)存的可用最大大小從2.5 GB減小到2GB。 由于舊的應(yīng)用程序已經(jīng)使用了如此大的本機(jī)內(nèi)存,因此此更改會(huì)使服務(wù)器崩潰 !!!
在這種情況下,唯一可以接受的解決方案是避免增加最大堆大小,部署新應(yīng)用程序并減少吞吐量。 這不是一個(gè)完美的解決方案,但這是在這種情況下唯一可行的解??決方案(因?yàn)槲覀兊腏ava進(jìn)程必須為32位)。
特別是在32位系統(tǒng)中,在增加Java堆大小之前,請(qǐng)注意Java進(jìn)程本機(jī)內(nèi)存的所需大小。 如果您處于這兩個(gè)空間沖突的情況,那么解決方案可能并非如此簡(jiǎn)單。 如果您不能更改代碼來(lái)克服這種情況,那么最常見(jiàn)的解決方案是移至最大進(jìn)程大小限制太大的64位系統(tǒng)。
有四件事要記住:
- 進(jìn)程大小的最大限制
- Java進(jìn)程的大小不僅由Java堆組成
- 無(wú)法明確配置Java進(jìn)程的本機(jī)(C-Heap)內(nèi)存的大小,因?yàn)镴ava堆空間可以實(shí)現(xiàn)
- 應(yīng)用程序所需的Java堆空間和本機(jī)(C堆)內(nèi)存空間的大小僅由應(yīng)用程序定義,并且這兩個(gè)空間之間沒(méi)有任何標(biāo)準(zhǔn)比率
參考:來(lái)自 Java的JCG合作伙伴 Adrianos Dadis的Java堆空間,本機(jī)堆和內(nèi)存問(wèn)題 ,集成和源博客的優(yōu)點(diǎn) 。
翻譯自: https://www.javacodegeeks.com/2013/01/java-heap-space-native-heap-and-memory-problems.html
總結(jié)
以上是生活随笔為你收集整理的Java堆空间,本机堆和内存问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机车游侠灵敏度设置(机车游侠怎么设置最佳
- 下一篇: 篮球起源于哪个国家(起源于美国的篮球运动