全部產品
Search
文件中心

Application Real-Time Monitoring Service:使用記憶體熱點診斷堆記憶體使用量高的問題

更新時間:Jul 06, 2024

ARMS記憶體熱點作為一種監控診斷工具,通過持續剖析技術記錄線程每個觸發堆記憶體配置閾值時的記憶體配置大小/次數,以及觸發時刻的方法棧快照,定位JVM堆記憶體使用量率高的根因。當系統JVM堆記憶體利用率高時,ARMS記憶體熱點可為您快速定位到導致堆記憶體申請量/申請次數高的相關商務邏輯方法棧。

開啟記憶體熱點

  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在左側導覽列中單擊應用設定,然後單擊自訂配置頁簽。

  4. 持續剖析地區開啟總開關,然後開啟記憶體熱點開關,配置需要開啟的應用執行個體的IP地址或者一組執行個體所屬的網段地址。

  5. 在頁面底部單擊儲存

    無需重啟應用即可生效。

通過持續剖析查看記憶體熱點資料

樣本:一個每秒申請1 MB堆記憶體的方法。

public class FixedRateAllocAction {

    //請求入口方法
   public void runBusiness() {
        try {
            sink = new byte[1024];
        } catch (InterruptedException e) {
            // Ignore
        }
    }
}
  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在左側導覽列單擊持續剖析,在左側執行個體列表中選擇目標執行個體,然後在右側版面設定資料展示時間。

  4. 在右側查詢頁簽,您可以篩選資料並查看彙總分析。

    image

  5. 單擊彙總分析,在新頁面中選擇效能分析類型Allocated Memory

    說明

    效能分析類型:

    • CPU Time:CPU申請量熱點剖析資料。更多資訊,請參見使用CPU熱點診斷CPU消耗高的問題

    • Allocated Memory:記憶體申請量熱點剖析資料。

    • Allocations:記憶體申請次數熱點剖析資料,可以查看哪些方法申請記憶體次數頻繁。

    image

    圖中左側為本次調用中涉及的所有方法堆記憶體申請量情況列表,右側為對應方法所有方法棧資訊繪製的火焰圖。其中:

    • Self列表示方法在自身的調用棧中所消耗的時間或資源,不包括其子方法調用所消耗的時間或資源。可以用於識別哪些方法在自身內部花費了大量的時間或資源。

    • Total列包含方法自身消耗的時間或資源,及其所有子方法調用所消耗的時間或資源。可以協助瞭解整個方法調用棧中哪些方法貢獻了最多的時間或資源。

    根據上圖,進行如下分析:

    1. 將Self值從大到小排列,找到並單擊Self值最大的方法com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness(),右側火焰圖中將會聚焦相關方法。

      image

    2. 聚焦後可以發現,com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()就是右側火焰圖中的最寬棧頂方法。

    3. 由於該較寬棧頂即為所分析應用自身定義的方法行,因此,com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()方法是該火焰圖所採集時段內資源佔用較大的顯著瓶頸所在,可以根據相關方法名,對業務中相關方法的邏輯進行梳理,查看是否存在最佳化空間。

通過上述分析,可以看到在1分鐘內,com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()方法申請了56.56 MB堆記憶體,與樣本情境邏輯基本吻合。