JavaRush /Java Blog /Random-TW /管理 Java 記憶體(並保存程式碼)的指南
pandaFromMinsk
等級 39
Минск

管理 Java 記憶體(並保存程式碼)的指南

在 Random-TW 群組發布
譯者註:翻譯這篇文章的願望是在六月的一個清晨,在地鐵車廂裡半睡半醒地讀完這篇文章後產生的。目標受眾:剛踏入 Java 世界的人們,由於其基本技術背景或願望的性質,我非常渴望深入了解 Java 並學習所有「電動」過程。我確信對於閱讀本文的人來說,這將是進入配置 JVM 和 GC 世界之旅的起點。順風順水!原始文章在這裡 作為一名開發人員,您花了無數的時間來清除 Java 應用程式中的錯誤並獲得所需的效能。在測試過程中,您會注意到應用程式運行速度逐漸變慢,最後完全崩潰或只是表現出較差的效能。最終接受內存洩漏發生的事實。Java 的垃圾收集器會盡力處理這些洩漏。但面對這樣的情況,能做的事情就有限了。您需要一些方法來識別記憶體洩漏呼叫、確定原因並了解 Java 垃圾收集器在影響整體應用程式效能方面的作用。

Java記憶體洩漏的主要症狀

有多種症狀表明應用程式存在記憶體洩漏問題。性能的輕微下降,而不是突然的應用程式故障,僅表明存在記憶體洩漏。該問題可能在每次運行期間發生,或者僅當應用程式開始處理大量資料時發生,或者相反,當您開始擴展應用程式時。一旦洩漏耗盡了所有可用的記憶體資源,應用程式可能會顯示記憶體不足錯誤。如果您重新啟動應用程式並希望得到最好的結果,您將遇到重複的崩潰,直到洩漏得到修復。一般來說,當物件引用累積而不是釋放記憶體時,就會發生記憶體洩漏。它們佔用所有可用內存,使應用程式無法存取其所需的資源。

配置錯誤表現為記憶體洩漏

在研究導致 Java 記憶體問題的情況並進行分析之前,您需要確保研究與完全不同的問題無關。一些記憶體不足錯誤是由於各種錯誤(例如配置錯誤)而發生的。該應用程式可能堆記憶體不足,或可能與系統上的其他應用程式衝突。如果您開始談論記憶體不足問題,但無法找出導致洩漏的原因,請從不同的角度查看應用程式。你會發現需要對終結線程進行更改或增加永久代空間量,永久代空間是 JVM 記憶體的一個區域,用於儲存 Java 類別的描述和一些附加資料。

記憶體監控工具的好處

記憶體監視工具可以更了解 Java 應用程式對可用資源的使用情況。透過使用此軟體,您可以進一步縮小記憶體洩漏和其他效能事件問題根源的搜尋範圍。這些工具分為多個類別,即使您正在處理記憶體洩漏,您可能需要使用各種應用程式來找出如何正確標記問題以及出了什麼問題。堆轉儲檔案提供了分析 Java 記憶體所需的資訊。在這種情況下,您需要使用兩個工具:一個用於產生轉儲文件,另一個用於詳細分析。該解決方案提供了有關應用程式所發生的詳細資訊。一旦工具找出了可能出現問題的位置,就會縮小範圍以發現事件的確切位置。而這段時間,是試錯時間最長、心情最緊張的一段時間。記憶體分析器指出了程式碼中的幾個問題,但您不能完全確定應用程式遇到了哪些問題。如果您仍然遇到相同的錯誤,請重新開始並解決另一個可能的錯誤。一次進行一項更改並嘗試重複錯誤。您需要讓應用程式運行一段時間才能重複錯誤情況。如果在第一次測試期間出現記憶體洩漏,請務必對應用程式進行負載測試。應用程式在處理少量資料時可能可以正常運作,但在處理大量資料時可能會再次拋出相同的錯誤。如果仍然出現相同的錯誤,您需要重新開始並尋找其他可能的原因。一旦應用程式完全運行,記憶體監控工具就會證明其有用性。您可以遠端監控 JVM 效能並在開發人員深入研究問題之前主動偵測故障情況並收集歷史效能資料以協助改善他們未來的程式設計技術並了解 Java 在重負載下的表現。許多解決方案包括「危險」警報模式或其他類似模式,以便開發人員可以立即知道出了什麼問題。每個開發人員都不希望關鍵應用程式在生產過程中崩潰並在應用程式停機期間造成數萬或數十萬美元的損失,因此記憶體監控工具可以縮短開發人員的回應時間。記憶體監控應用程式可讓您立即啟動診斷流程,而不是要求您去找客戶,因為沒有人會告訴您到底發生了什麼錯誤或應用程式產生了什麼錯誤代碼。如果您經常發現自己陷入 Java 應用程式的記憶體和效能問題中,請深入研究測試過程。確定開發過程中的每個弱點並改變您的測試策略。諮詢同事並將您的測試方法與現有的最佳實踐進行比較。有時您需要修改一小段程式碼,然後確保對整個應用程式產生持久影響。

垃圾收集器對 Java 記憶體和記憶體洩漏的作用

Java 中的垃圾收集器在應用程式效能和記憶體使用方面起著關鍵作用。它查找未使用的(死的)物件並刪除它們。這些物件不再佔用內存,因此您的應用程式將繼續確保資源可用性。有時,應用程式沒有給 GC 足夠的時間或資源來刪除死對象,它們就會累積。您可能會遇到這樣的情況:對您認為已死亡的物件進行主動存取。垃圾收集器對此無能為力,因為... 它的自動記憶體管理機制繞過活動對象。通常,垃圾收集器會自主運行,但您需要調整其行為以應對嚴重的記憶體問題。然而,GC 本身可能會導致效能問題。

GC 區域

垃圾收集器將物件分成不同的區域以優化組裝。年輕一代的特徵是物體很快就會消亡。垃圾收集器從清理工作開始就經常在這個區域工作。達到一定期限後仍存活的物件將被轉移到老年代。在舊一代區域,物件會保留很長時間,並且不會經常被收集器刪除。但是,當收集器在作用域中運行時,應用程式會執行一項大型操作,其中收集器會查找活動物件以清理垃圾。結果,應用程式物件位於最終的永久生成區域中。通常,這些物件包括必要的 JVM 元資料。應用程式在永久生成中不會產生太多垃圾,但需要收集器在不再需要類別時刪除類別。

垃圾收集器與回應時間的關係

無論應用程式執行緒的執行優先順序如何,垃圾收集器都會停止它們而不等待完成。這種現像被稱為「停止世界」事件。垃圾收集器的年輕代區域對效能影響較小,但如果 GC 進行密集清理,問題就會很明顯。您最終會遇到這樣的情況:年輕代 Minor GC 不斷運行,或舊一代進入不受控制的狀態。在這種情況下,您需要平衡年輕代頻率與需要增加該收集器區域大小的效能。垃圾收集器的永久代和老一代區域對應用程式效能和記憶體使用有顯著影響。這個主要的垃圾清理操作透過堆疊來推出死對象。該過程比次要建置需要更長的時間,並且效能影響可能需要更長的時間。當擦洗強度較高且老年代區域大小較大時,整個應用程式的表現會因「Stop the world」事件而陷入困境。優化垃圾收集需要監控程式運作的頻率、對整體效能的影響以及如何調整應用程式設定以降低監控頻率。您可能需要識別多次放置的相同對象,而應用程式不必將自己與放置隔離開來,或者您可能需要找到阻礙整個系統的壓縮點。獲得正確的平衡需要密切注意從 CPU 負載到垃圾收集器週期的所有方面,特別是在年輕代和舊世代不平衡的情況下。解決記憶體洩漏和優化垃圾收集有助於提高 Java 應用程式的效能。您實際上正在處理許多移動部件。但是,透過正確的故障排除方法和旨在提供嚴格可見性的分析工具,您將到達隧道盡頭的曙光。否則,您將遇到與效能相關的問題。仔細的記憶體放置和監控在 Java 應用程式中起著至關重要的作用。您需要完全控制垃圾收集、物件處置和效能之間的交互,以優化應用程式並避免記憶體不足錯誤。監控工具可協助您掌握潛在問題並突顯記憶體使用率趨勢,以便您採取主動的方法進行故障排除。記憶體洩漏通常表示以常規方法進行故障排除是無效的,尤其是在遇到不正確的配置參數值的情況下,但解決與記憶體相關的問題可以幫助您快速避免妨礙您的事件。Java記憶體調優和GC的完善讓你的開發過程變得更輕鬆。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION