在高階應用程式中使用記憶體

本主題提供高層級應用程式中記憶體使用的詳細資料。 如需適用于 RTApps () 之即時應用程式可用之記憶體的相關資訊,請參閱 管理記憶體和延遲考慮

高階應用程式可以存取下列記憶體和儲存空間:

  • 高階核心上的 256 KiB RAM,完全保留供高層級應用程式使用。 每個共用緩衝通道最多可配置 1 個 KiB,供高層級應用程式和 RTApps 通訊。
  • 1 MiB 唯讀快閃記憶體,在高階和即時核心之間共用。
  • 讀/寫 (可靜音) 儲存空間,當裝置重新開機時,儲存空間會持續存在。 如需可靜音儲存空間的相關資訊,請參閱 使用 Azure 球體上的儲存空間

注意

重複更新閃光燈最後會磨損,使其無效。 因此,您應該設計程式碼,以避免出現不必要的刷新更新。 例如,如果您想要在結束之前儲存應用程式狀態,以便在重新開機後復原已儲存的狀態,請考慮只在狀態已變更時,才將應用程式的狀態儲存到閃光燈。

決定快閃記憶體使用量

若要判斷您的快閃記憶體使用量,請只考慮包含圖像中繼資料、應用程式資訊清單和可執行圖像的圖像套件檔案大小。 您不需要考慮 Microsoft 提供的元件所需的儲存空間,例如 Azure 球體作業系統或執行時間服務,以及控制周邊設備並啟用Azure IoT 中樞連線的共用文件庫。 同樣地,您也不需要包含應用程式完整備份複本的大小,或啟用容錯移轉或復原的元件,以防損毀或發生空中更新問題。

不過,在開發和偵錯期間,偵錯程式的大小不計于限制。 偵錯程式會由 az 球形裝置啟用開發 自動新增,並由 [az 球體裝置 enable-cloud-test] (. 移除。/reference/az sphere-device.md) 。 您可以在 Microsoft Azure 球體 SDK 安裝目錄的 DebugTools 資料夾中搜尋 gdbserver.imagepackage,以尋找您的 SDK 所使用的偵錯程式大小。

如果應用程式映射套件和偵錯程式 (如果出現) 超過 1 MiB 總限制, az 球體裝置側載 命令會傳回錯誤。 az 球形圖像新增 -- 圖像命令,將新影像上傳到 Azure 球體目錄時,如果影像套件超過 1 MiB,也會傳回錯誤。

256 KiB RAM 限制僅適用于應用程式;您不需要允許偵錯程式使用 RAM。 其他記憶體是保留給核心分配。

目前針對目前 Azure 球體晶片 (MT3620) ) 所撰寫的應用程式,可用的快閃和 RAM 可能會增加 (,但永遠不會減少。 未來的 Azure 球形晶片可能會有不同的限制。

記憶體不足狀況

如果您的應用程式使用太多 RAM,Azure 球體作業系統會以 SIG}訊號終止它。 例如,在偵錯程式中,您會看到下列專案:

Child terminated with signal = 0x9 (SIGKILL)

如果高層級應用程式在收到 SIGTERM 要求後無法結束,也會出現 SIG}訊號。 如需詳細資料,請參閱 應用程式的生命週期

若要協助避免應用程式因記憶體不足而當機,請參閱 管理高階應用程式中 RAM 使用量的最佳做法

決定執行時間應用程式 RAM 使用量

Azure 球體提供數個函數,可在執行時間取得記憶體使用狀況資訊。 您可以使用這些功能來監控高階應用程式的記憶體使用量,以便在記憶體使用量超過您在 256 KiB 限制內指定的閾值時安全地重新開機應用程式。 可用的函數如下:

  • Applications_GetTotalMemoryUsageInKB:取得 kibibytes 的總記憶體使用量。 這是您應用程式在系統上的總實體記憶體使用量,包括核心配置 (,例如代表您的應用程式) 套接套接頭的緩衝區或偵錯伺服器,在 KiB) 中以原始值 (傳回。
  • Applications_GetUserModeMemoryUsageInKB:以 kibibytes 取得使用者模式記憶體使用量。 這是您的應用程式直接使用的實體記憶體量、任何媒體櫃代表其使用的記憶體 (也稱為 aon 配置) ,以及偵錯伺服器使用的記憶體,在 KiB) 中傳回為原始值 (。
  • Applications_GetPeakUserModeMemoryUsageInKB:以 kibibytes 取得使用者模式記憶體使用量的尖峰。 這是目前會話中使用的最大使用者記憶體量。 測試應用程式的記憶體使用量時,您應該確保此值不會超過 256 KiB。 每當您的應用程式重新開機或重新部署時,此值會重設。 使用此函數可概略瞭解您的應用程式接近建議的 256 KiB 限制。

若要在您的高階應用程式中使用這些函數,請包含應用程式。h 頁首檔案。 您可以在開發期間使用這些函數來瞭解應用程式的整體記憶體使用方式,但您也可以搭配記錄功能一起使用這些函數 ,從欄位中的裝置擷取資訊記憶體過度使用偵測與清理片段示範如何偵測並優雅地處理非預期的記憶體使用量。

注意

這些函數會傳回作業系統所看到的記憶體使用量。 目前,這些函數不會回報應用程式在使用者堆上釋放記憶體以進行配置。 記憶體會傳回至馬勒克文件庫供日後使用,但作業系統報告的統計資料會保持不變,除非作業系統本身已配置並釋放記憶體。 例如,將記憶體分配給套接座。 因此,這些函數對於瞭解最糟的情況非常有用,可協助您的應用程式以可靠的最大限度運作。 值為近似值,可能會因作業系統版本而異。

新增堆記憶體配置追蹤

您可以新增 堆處理記憶體配置追蹤,藉此取得額外的記憶體使用量資訊,這會顯示靜態和動態連結的文件庫正在進行哪些使用者和核心配置。 這可讓您更完整地瞭解應用程式使用記憶體的位置,以協助您以最有效率的方式使用記憶體。 此功能適用于 Azure 球體 OS 版本 21.07 或更新版本,且應用程式執行時間版本 (ARV) 10 或更新版本,僅適用于具有開發功能的裝置,而且只有在應用程式 在偵錯程式下執行時才能使用。

注意

您必須完成本節所述的組態工作,才能正確運作堆填記憶體配置追蹤。 如果您未執行此動作,將會在編譯期間回報警告,並且不會顯示堆記憶體資訊。

若要啟用堆記憶配置追蹤,您必須執行兩件事:

  • 將 HeapMemStats 功能新增至應用程式的 應用程式資訊清單.json 檔案

      "Capabilities": {
        "HeapMemStats": true
      },
    
  • 新增應用程式 CMakeLists.txt 檔案中的命令,將 libmalloc 文件庫新 DEBUG_LIB "libmalloc" 增至 azsphere_target_add_image 您的影像套件:

    azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc")
    

重要

由於堆處理記憶體配置追蹤只能在具有開發功能的裝置上運作,您應該先執行下列動作,在建置用於部署的映射套件之前,將它從應用程式中移除:

  • 從應用程式的 app-manifest.json 檔案中刪除「HeapMemStats」: true「 行。
  • 從應用程式 CMakeLists.txt azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc" 檔案中的命令中移除 DEBUG_LIB "libmalloc"

使用 Visual Studio 效能設定檔

如果您使用 Visual Studio,您可以使用其效能配置檔案管理員功能來取得應用程式記憶體使用量的相關資訊。 如需使用此設定檔程式的教學課程,請參閱 教學課程/MemoryUsage

先決條件

啟動記憶體使用量設定檔

  1. 取 [偵錯>效能設定檔],或按Alt+F2以開啟效能設定檔建立器開始視窗。

    Visual Studio 效能設定檔程式視窗

  2. [分析目標] 底下,如果看不到 Azure 球體裝置設定檔, 請選取 [選擇目標 ],然後選取 [Azure 球體裝置設定檔器]

  3. [可用的工具] 底下,確定已核取 Azure 球體記憶體使用量 ,然後選取 [ 開始 ] 以開啟記憶體使用量分析視窗並啟動記憶體配置檔案管理員。

  4. 如果您需要部署或重新開機應用程式,請選取 [在不偵錯的情況下> 開始],或按Ctrl+F5將應用程式部署到裝置。

    重要

    若要為您的應用程式取得正確的 RAM 使用資訊,請務必 ( (buid-hl-app.md#build-and-deploy-the-application-in-visual-studio-without-debugging) 。 在偵錯程式下執行您的應用程式會導致 RAM 使用量過大,因為偵錯伺服器所使用的記憶體會包含在回報的 RAM 使用狀況統計資料中。

解讀記憶體使用量設定檔

記憶體使用量分析視窗會顯示如下所示的檢視:

Visual Studio 記憶體使用狀況設定檔程式視窗

在檢視中央, Azure 球體裝置實體記憶體 圖形繪製了三個不同的 RAM 使用狀況統計資料, (在您的應用程式執行時顯示到最接近的 KiB) 三個不同的線條:

  • 總: 您應用程式在系統上的總實體記憶體使用量,包括核心配置 (,例如套接套介面的緩衝) 代表您的應用程式或偵錯伺服器。
  • 使用者: 您的應用程式直接使用的實體記憶體量、任何文件庫代表其使用的記憶體 (也稱為 附加 配置) ,以及偵錯伺服器使用的記憶體。
  • 使用者最大使用量: 目前會話中使用的使用者記憶體上限。 測試應用程式的記憶體使用量時,您應該確保此值不會超過 256 KiB。 其他記憶體是保留給核心分配。 每當您的應用程式重新開機或重新部署時,此值會重設。

圖表也會繪製新最大使用量事件的出現 (以三角形) 表示。 每當 [最大使用者記憶體使用量] 有新的上限時,就會發生此事件。 此活動已針對螢幕助讀程式協助工具啟用。

如果您已啟用 堆處理記憶體配置追蹤 ,而您的應用程式並未在偵錯工具下執行,您會看到一個額外的圖形,顯示堆記憶體統計資料:

  • 合計:由或代表您的應用程式佈建的總堆記憶體,包括靜態和動態文件庫。
  • 共用文件庫堆:從 Azure 球體作業系統提供動態連結文件庫的配置。

Visual Studio 堆處理記憶體使用量

在圖形上方,時程表檢視會顯示應用程式的執行時間,與下圖上的資料相互關聯。 使用 [放大 ] 和 [ 縮小] 來專注于特定的時段。

在圖形下方,表格檢視會顯示相同的記憶體統計資料和事件。

提示

若要將資料從表格複製到剪貼簿,請按 Ctrl+A 以選取所有列,然後按 Ctrl+C

本節顯示的前兩個圖形是執行內 存使用量教學課程的階段 1時所繪製,其中包含記憶體洩漏。 每一張圖表中的記憶體使用量都會單色調地上升,提供洩漏的視覺證據。 修正洩漏時,如內 存使用量教學課程的第 2 階段一樣,圖形會在配置和處理記憶體時起起並落下。

Visual Studio 堆處理記憶體使用量而不會發生記憶體洩漏

檢視總記憶體使用量的統計資料

az 球形裝置應用程式顯示記憶體統計資料命令會傳回在附加裝置上執行之應用程式總記憶體使用量、使用者模式使用量,以及最大使用者模式使用量的記憶體使用量統計資料。 裝置必須已設定 app 的 裝置功能,才能執行此命令。

執行應用程式時顯示的 RAM 使用狀況統計資料如下:

  • 合計 (核心 + 使用者模式) :您應用程式在系統上的總實體記憶體使用量,包括核心配置 (,例如代表您的應用程式或偵錯伺服器) 套接套接的緩衝) 。
  • 使用者模式:您的應用程式直接使用的實體記憶體量、任何媒體櫃代表其使用的記憶體 (也稱為 附加 配置) ,以及偵錯伺服器使用的記憶體。
  • 使用者模式最大使用量:目前會話中使用的使用者記憶體上限。 測試應用程式的記憶體使用量時,您應該確保此值不會超過 256 KiB。 其他記憶體是保留給核心分配。 每當您的應用程式重新開機或重新部署時,此值會重設。

如果您已啟用 堆處理記憶體配置追蹤 ,而您的應用程式未在偵錯工具下執行,您會看到額外的堆堆記憶體統計資料行:

  • 堆:應用程式 + 靜態文件庫:程式碼和任何以靜態方式連結之文件庫的核心和使用者配置。
  • 堆: < 動態文件庫配置 >:來自 Azure 球體作業系統所提供之個別動態連結文件庫的配置。

持續監控記憶體使用量

若要監控一段時間的記憶體使用量,您可以使用腳本來執行 [az 球形裝置應用程式 show-memory-stats] (。。/reference/az sphere-device.md) 命令迴圈顯示,如下列範例所述:

Windows 命令提示字元

使用記事本或其他文字編輯器,建立包含下列內容的批次處理腳本檔案 memuse.bat:

@echo off

:loop
call az sphere device app show-memory-stats
choice /d y /t 1 > nul
goto loop

如果批次處理腳本不在目前的目錄中,請在命令提示字元 (輸入批次腳本的名稱或檔案的完整路徑) :

C:\Users\username> memuse.bat
 -------------------------- -------------
 Name                       Usage (bytes)
 ========================================
 Total (Kernel + User Mode) 65536
 -------------------------- -------------
 User Mode                  36864
 -------------------------- -------------
 Peak User Mode             36864
 -------------------------- -------------
 -------------------------- -------------
 Name                       Usage (bytes)
 ========================================
 Total (Kernel + User Mode) 65536
 -------------------------- -------------
 User Mode                  36864
 -------------------------- -------------
 Peak User Mode             36864
 -------------------------- -------------

若要結束腳本,請在[命令提示字元] 視窗中輸入Ctrl+C,然後回答Y的「終止批次工作?」提示。

Windows PowerShell

while ($true) {
    az sphere device app show-memory-stats
    Start-Sleep -Seconds 1
}

記憶體使用量和偵錯工具

在偵錯程式下執行應用程式時,回報的記憶體統計資料也包括偵錯伺服器程式的記憶體使用量,以及偵錯造成的其他記憶體使用量,例如設定中斷點。 因此,您在嘗試收集正確的記憶體統計資料時,應一律不偵錯地執行應用程式。

不過,如果您使用偵錯工具執行應用程式,使用記憶體使用量設定檔器會很有用。 設定中斷點並逐步流覽程式程式碼,同時觀察記憶體使用量的相對變化,是識別記憶體使用量尖峰或記憶體洩漏原因的實用技巧。

在 Visual Studio 中偵錯時,Performance Profiler 會自動開啟,但不會顯示堆機記憶體配置追蹤。