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