共用方式為


排解記憶體問題的工具

注意

基本標準和企業方案將從 2025 年 3 月中旬開始淘汰,並停用 3 年。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 Azure Spring Apps 淘汰公告

標準 耗用量和專用 方案將從 2024 年 9 月 30 日起淘汰,並在六個月後完成關閉。 建議您轉換至 Azure Container Apps。 如需詳細資訊,請參閱 將 Azure Spring Apps 標準取用和專用方案遷移至 Azure Container Apps

本文適用於:✅ 基本/標準 ✅ 企業

本文說明排解 Java 記憶體問題的各種實用工具。 您可以在許多案例中使用這些工具,不限於記憶體問題,但本文僅著重於記憶體主題。

警示和診斷

下列各節說明可透過 Azure 入口網站取得的資源健康情況警示和診斷。

資源健康情況

您可以使用 Azure 活動記錄和 Azure 服務健康狀態來監控應用程式生命週期事件和設定警示。 如需詳細資訊,請參閱使用 Azure 活動記錄和 Azure 服務健康狀態來監視應用程式生命週期事件

由於容器記憶體不足 (OOM) 的問題,資源健康情況會傳送關於應用程式重新啟動事件的警示。 如需更多資訊,請參閱記憶體不足造成應用程式重新啟動的問題

下列螢幕擷取畫面顯示應用程式資源健康情況警示,指出 OOM 問題。

Azure 入口網站的螢幕擷取畫面,顯示 Azure Spring 應用程式資源健康情況頁面,並醒目提示 OOM 訊息。

診斷並解決問題

Azure Spring Apps 診斷是一種應用程式疑難排解的互動式體驗,無須進行組態。 如需更多資訊,請參閱在 Azure Spring 應用程式中自我診斷和解決問題

在 Azure 入口網站中,您可以在 [診斷和解決問題] 下找到 [記憶體用量],如下列螢幕擷取畫面所示。

Azure 入口網站的螢幕擷取畫面,其中顯示 Azure Spring 應用程式診斷和解決問題頁面,並醒目提示下拉式功能表中的記憶體使用量。

記憶體用量提供應用程式記憶體用量簡單診斷,如下列螢幕擷取畫面所示。

Azure 入口網站的螢幕擷取畫面,其中顯示 Azure Spring 應用程式記憶體使用量頁面。

計量

下列各節說明各種計量,包含高記憶體使用量、堆積記憶體太大,以及異常記憶體回收異常 (太頻繁或不夠頻繁) 等問題。 如需更多資訊,請參閱快速入門:使用記錄、計量和追蹤來監視 Azure Spring 應用程式

應用程式記憶體用量

應用程式記憶體用量等於使用的應用程式記憶體除以應用程式記憶體限制的百分比。 此值會顯示整個應用程式記憶體。

jvm.memory.used/committed/max

針對 JVM 記憶體,共有三個計量:jvm.memory.usedjvm.memory.committedjvm.memory.max,如下列清單中所述。

「JVM 記憶體」不是明確定義的概念。 在這裡,jvm.memory堆積記憶體非堆積記憶體之前 permGen 組件的總和。 JVM 記憶體不包含直接記憶體或執行緒堆疊等其他記憶體。 Spring Boot Actuator 會收集這三個計量,並判斷 jvm.memory 的範圍。

  • jvm.memory.used 是 JVM 記憶體的使用量,包括已使用的堆積記憶體,以及非堆積記憶體中已使用的先前 permGen。

    jvm.memory.used 是堆積記憶體變更的主要反映,因為先前的 permGen 組件通常穩定。

    如果您發現 jvm.memory.used 太大,請考慮設定較小的堆積記憶體大小上限。

  • jvm.memory.committed 是供 JVM 使用的記憶體數量。 jvm.memory.committed 的大小基本上是可用 JVM 記憶體的限制。

  • jvm.memory.max 是 JVM 記憶體的數量上限,請勿與實際可用數量混淆。

    jvm.memory.max 的值有時可能會令人混淆,因為它可能比可用的應用程式記憶體高很多。 在此釐清,jvm.memory.max 是堆積記憶體和非堆積記憶體先前 permGen 組件的所有大小總和,不論實際可用的記憶體為何。 例如,如果在 Azure Spring 應用程式入口網站中設定了 1 GB 記憶體,則預設堆積記憶體大小是 0.5 GB。 如需更多資訊,請參閱 Java 記憶體管理預設最大堆積大小一節。

    如果預設壓縮類別空間大小為 1 GB,則不論應用程式記憶體大小是否為 1GB,jvm.memory.max 的值都會大於 1.5 GB。 如需更多資訊,請參閱 Oracle 文件中的 Java 平台,標準版本 HotSpot 虛擬機器記憶體回收微調指南:其他考量

jvm.gc.memory.allocated/promoted

這兩個計量是用於觀察 Java 記憶體回收 (GC)。 如需更多資訊,請參閱 Java 記憶體管理Java 記憶體回收一節。 堆積大小上限會影響次要 GC 和完整 GC 的執行頻率。 中繼空間和直接記憶體的大小上限會影響完整 GC。 如果您想要調整記憶體回收的頻率,請考慮修改下列最大記憶體大小。

  • jvm.gc.memory.allocated 是在兩個 GC 之間,新世代記憶體集區增加的大小。 此值反映次要 GC。

  • jvm.gc.memory.promoted 是在 GC 之後,舊世代記憶體集區增加的大小。 此值反映完整 GC。

您可以在Azure 入口網站中找到這項功能,如下列螢幕擷取畫面所示。 您可以選擇特定計量,並新增特定應用程式、部署或執行個體的篩選條件。 您也可以套用分割。

Azure 入口網站的螢幕擷取畫面,其中顯示 Azure Spring 應用程式計量頁面。

進一步偵錯

如要進一步偵錯,您可以手動擷取堆積傾印和執行緒傾印,並使用 Java Flight Recorder (JFR)。 如需相關資訊,請參閱手動擷取堆積傾印和執行緒傾印,並在 Azure Spring Apps 中使用 Java Flight Recorder

堆積傾印會記錄 Java 堆積記憶體的狀態。 執行緒傾印會記錄所有即時執行緒的堆疊。 這些工具可透過 Azure CLI 和Azure 入口網站的應用程式頁面取得,如下列螢幕擷取畫面所示。

Azure 入口網站的螢幕擷取畫面,其中顯示應用程式概觀頁面,並醒目提示疑難排解按鈕。

如需相關資訊,請參閱手動擷取堆積傾印和執行緒傾印,並在 Azure Spring Apps 中使用 Java Flight Recorder。 您也可以使用記憶體分析器之類的第三方工具來分析堆積傾印。

修改組態以修正問題

您能識別部分問題,包括容器 OOM、堆積記憶體過大,以及異常記憶體回收問題。 如果您識別出這些問題,您可能需要在 JVM 選項中設定記憶體大小上限。 如需詳細資訊,請參閱 Java 記憶體管理重要 JVM 選項區段。

您可以使用 Azure 入口網站或 Azure CLI 來修改 JVM 選項。

在 Azure 入口網站中,瀏覽至應用程式,然後從導覽功能表的 [設定] 區段選取 [組態]。 在 [一般設定] 索引標籤上,更新 [JVM 選項] 欄位,如下列螢幕擷取畫面所示:

Azure 入口網站的螢幕擷取畫面,其中顯示應用程式組態頁面,並醒目提示 JVM 選項。

另請參閱