共用方式為


針對記憶體問題進行疑難解答的工具

注意

Azure Spring Apps 是 Azure Spring Cloud 服務的新名稱。 雖然服務有新的名稱,但在我們努力更新資產,例如螢幕快照、影片和圖表時,您會在某些地方看到舊名稱一段時間。

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

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

警示和診斷

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

資源健康情況

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

資源健康狀態會傳送應用程式重新啟動事件的相關警示,因為容器記憶體不足 (OOM) 問題。 如需詳細資訊,請參閱 因記憶體不足問題所造成的應用程式重新啟動問題

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

Screenshot of Azure portal showing Azure Spring Apps Resource Health page with OOM message highlighted.

診斷並解決問題

Azure Spring Apps 診斷是一種互動式體驗,可針對沒有設定的應用程式進行疑難解答。 如需詳細資訊,請參閱 在 Azure Spring Apps 中自我診斷和解決問題。

在 Azure 入口網站 中,您可以在 [診斷並解決問題] 下找到 [記憶體使用量],如下列螢幕快照所示。

Screenshot of Azure portal showing Azure Spring Apps Diagnose and solve problems page with Memory Usage highlighted in drop-down menu.

記憶體使用量 提供應用程式記憶體使用量的簡單診斷,如下列螢幕快照所示。

Screenshot of Azure portal showing Azure Spring Apps Memory Usage page.

計量

下列各節說明涵蓋高記憶體使用量、堆積記憶體太大以及異常垃圾收集異常(太頻繁或不夠頻繁)等問題的計量。 如需詳細資訊,請參閱 快速入門:使用記錄、計量和追蹤監視 Azure Spring Apps 應用程式。

應用程式記憶體使用量

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

jvm.memory.used/committed/max

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

「JVM 記憶體」不是明確定義的概念。 jvm.memory以下是非堆積記憶體堆積記憶體和先前 permGen 部分的總和。 JVM 記憶體不包含直接記憶體或其他記憶體,例如線程堆疊。 Spring Boot 執行器會收集這三個計量,並判斷的範圍 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 Apps 入口網站中以 1 GB 的記憶體設定應用程式,則預設堆積記憶體大小為 0.5 GB。 如需詳細資訊,請參閱 Java 記憶體管理的預設最大堆積大小一節。

    如果默認 壓縮的類別空間 大小為 1 GB,則 的值 jvm.memory.max 會大於 1.5 GB,而不論應用程式記憶體大小是否為 1 GB。 如需詳細資訊,請參閱 Java Platform,Standard Edition HotSpot 虛擬機垃圾收集微調指南:Oracle 檔中的其他考慮

jvm.gc.memory.allocated/promoted

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

  • jvm.gc.memory.allocated 是一個 GC 之後和下一個 GC 之後,年輕一代記憶體集區大小增加的數量。 此值反映次要 GC。

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

您可以在 Azure 入口網站 上找到這項功能,如下列螢幕快照所示。 您可以選擇特定計量,並新增特定應用程式、部署或實例的篩選條件。 您也可以套用分割。

Screenshot of Azure portal showing Azure Spring Apps Metrics page.

進一步偵錯

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

堆積傾印會記錄 Java 堆積記憶體的狀態。 線程傾印會記錄所有即時線程的堆疊。 這些工具可透過 Azure CLI 取得,並在 Azure 入口網站 的應用程式頁面上取得,如下列螢幕快照所示。

Screenshot of Azure portal showing app overview page with Troubleshooting button highlighted.

如需詳細資訊,請參閱 在 Azure Spring Apps 中手動擷取堆積傾印和線程傾印和使用 Java Flight Recorder。 您也可以使用記憶體分析器第三方工具來分析堆積傾印。

修改組態以修正問題

您可能會識別的一些問題包括 容器 OOM、堆積記憶體太大,以及異常垃圾收集。 如果您識別出這些問題,您可能需要在 JVM 選項中設定記憶體大小上限。 如需詳細資訊,請參閱 Java 記憶體管理的重要 JVM 選項一節。

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

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

Screenshot of Azure portal showing app configuration page with JVM options highlighted.

另請參閱