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