共用方式為


因記憶體不足問題所造成的應用程式重新啟動問題

注意

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

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

本文說明 Azure Spring Apps 中 Java 應用程式的記憶體不足 (OOM) 問題。

記憶體不足問題的類型

記憶體不足問題有兩種類型:容器 OOM 和 JVM OOM。

  • 容器 OOM 也稱為系統 OOM,會在可用的應用程式記憶體用盡時發生。容器 OOM 問題會導致應用程式重新啟動事件,這些事件會在 Azure 入口網站 的 資源健康狀態 區段中回報。 一般而言,容器 OOM 是由不正確的記憶體大小設定所造成。

  • 當已使用記憶體數量達到 JVM 選項中設定的大小上限時,就會發生 JVM OOM。 JVM OOM 不會造成應用程式重新啟動。 一般而言,JVM OOM 是錯誤程式代碼的結果,您可以在應用程式記錄檔中尋找 java.lang.OutOfMemoryError 例外狀況。 JVM OOM 對應用程式和 Java 分析工具有負面影響,例如 Java Flight Recorder。

本文著重於如何修正容器 OOM 問題。 若要修正 JVM OOM 問題,請檢查堆積傾印、線程傾印和 Java Flight Recorder 等工具。 如需詳細資訊,請參閱 在 Azure Spring Apps 中手動擷取堆積傾印和線程傾印和使用 Java Flight Recorder。

因 OOM 而修正應用程式重新啟動問題

下列各節說明可用來診斷和修正容器 OOM 問題的工具、計量和 JVM 選項。

在 [資源健康情況] 頁面上檢視警示

Azure 入口網站 上的 [資源健康情況] 頁面會顯示因容器 OOM 而發生的應用程式重新啟動事件,如下列螢幕快照所示:

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

設定記憶體大小

計量應用程式記憶體使用量jvm.memory.used並提供jvm.memory.committed記憶體使用量的檢視。 如需詳細資訊,請參閱工具的計量一節,以針對記憶體問題進行疑難解答。 在 JVM 選項中設定記憶體大小上限,以確保記憶體低於限制。

Java 記憶體模型中所有元件記憶體大小上限的總和應該小於實際可用的應用程式記憶體。 若要設定記憶體大小上限,請參閱 Java 記憶體管理之內存使用量配置一節中所述一般記憶體配置。

當您設定記憶體大小上限時,請尋找平衡點。 當您設定記憶體大小上限過高時,有容器 OOM 的風險。 當您設定記憶體大小上限過低時,可能會有 JVM OOM 的風險,而垃圾收集將會降低應用程式的速度。

控制堆積記憶體

您可以使用、-Xmx-XX:InitialRAMPercentage-XX:MaxRAMPercentage JVM 選項來設定堆積大小-Xms上限。

當 的值 jvm.memory.used 在計量中太高時,您可能需要調整堆積大小上限設定。 如需詳細資訊,請參閱工具的 jvm.memory.used/committed/max 一節,以針對記憶體問題進行疑難解答。

控制直接記憶體

請務必基於下列原因設定 -XX:MaxDirectMemorySize JVM 選項:

  • 當 nio 和 gzip 等架構使用直接記憶體時,您可能不會注意到。
  • 直接記憶體的垃圾收集只會在完整垃圾收集期間處理,而且只有在堆積接近滿時才會進行完整垃圾收集。

一般而言,您可以將 設定 MaxDirectMemorySize 為小於應用程式記憶體大小的值減去堆積記憶體減去非堆積記憶體。

控制中繼空間

您可以藉由設定 JVM 選項來設定 -XX:MaxMetaspaceSize 中繼空間大小上限。 選項會 -XX:MetaspaceSize 設定臨界值以觸發完整垃圾收集。

中繼空間記憶體通常穩定。

另請參閱