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