Java培訓(xùn):解決內(nèi)存飽和錯誤
在本文中,我們將研究Dynatrace在托管多個JVM的機器上報告的內(nèi)存飽和錯誤的解決方案。
在Linux機器上,當內(nèi)存使用率超過80%且頁面錯誤超過每秒20個頁面錯誤時,Dynatrace會拋出內(nèi)存飽和錯誤。若想要更加系統(tǒng)更加詳細的學(xué)習(xí) JVM 知識,建議參加java培訓(xùn),有經(jīng)驗豐富的專業(yè)講師面授指導(dǎo)教學(xué),能夠幫你更全面了解JVM。
我們假設(shè)我們使用的是一臺具有128GB內(nèi)存的Linux機器,6個應(yīng)用程序JVM正在運行,16GB被設(shè)置為最小和最大堆大小。如果JVM開始消耗更多內(nèi)存,可能會引發(fā)內(nèi)存飽和錯誤。當最小(-Xms)和最大(-Xmx)堆值設(shè)置為16GB時,系統(tǒng)將為每個JVM向堆提交16GB的RAM空間。JVM將使用這個16GB用于堆,除此之外,它還需要更多的內(nèi)存來進行處理。總體而言,每個JVM可能需要大約20GB的內(nèi)存來完成處理,這取決于每個JVM的請求。在某一點上,所有6個JVM都可能使用大約120GB的內(nèi)存,從而導(dǎo)致該機器中出現(xiàn)內(nèi)存飽和錯誤和頁面錯誤。

有三種方法可以解決這個問題。
第一個也是最簡單的方法是向現(xiàn)有機器添加更多內(nèi)存。如果我們在這臺機器上再增加128GB,將內(nèi)存增加一倍,這將使這臺機器總共擁有256GB的內(nèi)存?,F(xiàn)在,在我們的情況下,如果進程消耗256GB中的120GB,這不到總內(nèi)存使用量的50%,并且不會達到80%的內(nèi)存使用閾值。此外,由于內(nèi)存中有空間容納所有頁面,因此不會發(fā)生頁面錯誤。Dynatrace將消除內(nèi)存飽和錯誤。這種方法的缺點是,如果它是數(shù)據(jù)中心中的一臺機器,最終將導(dǎo)致硬件采購成本。如果它是一個云實例,它將占用一個具有更多內(nèi)存的實例,這將導(dǎo)致額外的成本。在java培訓(xùn)中,也有關(guān)于JVM內(nèi)存的學(xué)習(xí),學(xué)好這部分的知識,可以避免在工作中出現(xiàn)的很多問題。
第二種方法是調(diào)查JVM是否需要那么多內(nèi)存,并對其進行優(yōu)化。這種方法需要進行詳細分析,以確定占用更多內(nèi)存的區(qū)域,優(yōu)化并降低內(nèi)存使用率。這將有助于減少所有6個JVM占用的內(nèi)存,并在相同的硬件上運行應(yīng)用程序而不會出現(xiàn)任何內(nèi)存飽和錯誤,無需任何升級。這種方法需要時間,具體取決于優(yōu)化應(yīng)用程序內(nèi)存使用所涉及的復(fù)雜性。
第三種方法是不對最小和最大堆大小參數(shù)設(shè)置相等的值。相反,為應(yīng)用程序所需的最小堆大小參數(shù)設(shè)置一個最小值。例如,將最小堆大小(-Xms)設(shè)置為4GB,將最大堆大小(-Xmx)設(shè)置為16GB。這將使系統(tǒng)最初每個JVM只提交4GB的堆大小,從而將整個JVM內(nèi)存使用量減少到每個JVM 8GB以下。所有6個JVM將占用大約58GB,這將使總內(nèi)存使用率降至50%以下,并避免內(nèi)存飽和錯誤。如果應(yīng)用程序確實消耗了較少的堆內(nèi)存,這將起作用。如果堆大小增長到最大堆大小,這可能會成為一個問題,如果所有JVM都達到該值,這將使系統(tǒng)提交16GB,從而導(dǎo)致內(nèi)存飽和錯誤。參加java培訓(xùn)學(xué)習(xí),可以在短時間內(nèi)獲得很大提升,避免在學(xué)習(xí)上多走彎路,節(jié)省時間,提高學(xué)習(xí)效率。
在了解堆使用模式后,可以采用這種方法,如果應(yīng)用程序的堆使用率較低,則會有所幫助。將不同的值設(shè)置為最小和最大堆大小可能對堆收縮和擴展影響不大。與系統(tǒng)中發(fā)生的頁面錯誤相比,這種影響將更小。
根據(jù)發(fā)生內(nèi)存飽和錯誤的場景,可以應(yīng)用上述推薦的任何一種或所有方法來解決Dynatrace中的內(nèi)存飽和錯誤。想對JVM有更深入的了解,可以參加java培訓(xùn),在專業(yè)老師的指導(dǎo)下,你可以很快掌握JVM的更多特性。