減少延遲對java開發(fā)人員來說是一個(gè)新的挑戰(zhàn),所以我們需要最佳的工具來解決它。有許多可用的工具,既有開源的也有付費(fèi)的。
在本文中,介紹與大型生產(chǎn)應(yīng)用程序的內(nèi)存分析相關(guān)的挑戰(zhàn),以及如何克服這些挑戰(zhàn)。
挑戰(zhàn)
1.大型應(yīng)用程序的JVM堆內(nèi)存占用相當(dāng)大,分析如此大的堆轉(zhuǎn)儲(chǔ)需要大量內(nèi)存來運(yùn)行分析器工具,并且在普通的筆記本電腦上通常很慢。
2.大型堆轉(zhuǎn)儲(chǔ)消耗等量的磁盤空間。如果沒有足夠的磁盤,堆轉(zhuǎn)儲(chǔ)命令將失敗,或者在最壞的情況下,填滿根分區(qū)并使運(yùn)行它的主機(jī)崩潰。
3.堆轉(zhuǎn)儲(chǔ)是一個(gè)世界末日事件。進(jìn)行堆轉(zhuǎn)儲(chǔ)會(huì)暫停應(yīng)用程序中的所有活動(dòng),這可能導(dǎo)致服務(wù)的運(yùn)行狀況檢查失敗,并可能導(dǎo)致服務(wù)被終止,從而難以獲取堆轉(zhuǎn)儲(chǔ)文件。
解決辦法
1.在大型堆轉(zhuǎn)儲(chǔ)的情況下,最好使用像AWS EC2這樣的具有足夠內(nèi)存和磁盤空間的基于云的資源。
2.為了解決磁盤空間問題,如果應(yīng)用程序運(yùn)行在一些云資源上,那么它通常有單獨(dú)的存儲(chǔ)附加到它。在進(jìn)行堆轉(zhuǎn)儲(chǔ)之前,可以增加單獨(dú)的存儲(chǔ)。
3.檢查是否使用定期運(yùn)行狀況檢查來監(jiān)控應(yīng)用程序,例如,它是否是負(fù)載平衡器的一部分。在這種情況下,需要將它從服務(wù)機(jī)隊(duì)中取出,以避免在堆轉(zhuǎn)儲(chǔ)命令啟動(dòng)后被終止。
4.以一定的時(shí)間間隔獲取多個(gè)堆轉(zhuǎn)儲(chǔ),以捕獲服務(wù)狀態(tài)的變化。
改進(jìn)
1.最大的元兇之一是內(nèi)存中的緩存,這導(dǎo)致了過多的保留堆,從而導(dǎo)致頻繁的垃圾收集和延遲影響。
2.內(nèi)存分析給出了一個(gè)主要的線索,關(guān)于用于數(shù)據(jù)檢索的數(shù)據(jù)索引是如何被使用的。結(jié)果是,完整的索引被裝載在JVM堆中,也存儲(chǔ)在tmpfs上,因此使用了兩倍的所需內(nèi)存,這是不必要的,還會(huì)導(dǎo)致頻繁的垃圾收集。
結(jié)論
分析任何大規(guī)模生產(chǎn)應(yīng)用程序的內(nèi)存都是至關(guān)重要的。在應(yīng)用程序中緩存數(shù)據(jù)可能是有用的,但是應(yīng)該密切監(jiān)視,以監(jiān)視隨著時(shí)間的推移是否有任何降級(jí)。
堆轉(zhuǎn)儲(chǔ)分析是一個(gè)強(qiáng)大的工具。如果使用正確的機(jī)器和工具,它會(huì)變得很痛苦。注意生產(chǎn)應(yīng)用程序的運(yùn)行狀況檢查例程,同時(shí)采用堆轉(zhuǎn)儲(chǔ)來成功收集這些例程。