高階應用程式中的記憶體使用
重要
這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。
本主題提供高階應用程式中記憶體使用的詳細數據。 如需即時可用的應用程式可用記憶體的相關信息,請參閱 管理記憶體和延遲考慮 。
高階應用程式可以存取下列記憶體和記憶體:
- 高階核心上的 256 KiB RAM,完全保留供高階應用程式使用。 此空間中最多 1 KiB 可以配置給每個共用緩衝區通道,透過此通道進行高階應用程式和 RTApps 通訊。
- 1 MiB 只讀快快快閃記憶體,在高階和即時核心之間共用。
- 讀取/寫入(可變)記憶體,會在裝置重新啟動時保存。 如需可變動記憶體的相關信息,請參閱 在 Azure Sphere 上使用記憶體。
注意
重複更新閃光最終會磨損它,並使它無效。 因此,您應該設計程序代碼,以避免不必要的快閃更新。 例如,如果您想要在結束之前儲存應用程式狀態,以便在重新啟動后復原已儲存的狀態,請考慮只在狀態變更時,才將應用程式的狀態儲存至快閃。
判斷快快閃記憶體使用量
若要判斷您的快快閃記憶體使用量,請只考慮映像套件檔案的大小,其中包含映像元數據、應用程式指令清單和可執行檔映像。 您不需要考慮Microsoft提供的元件所需的記憶體,例如 Azure Sphere OS 或運行時間服務和共用連結庫,這些連結庫會控制周邊,並啟用與 Azure IoT 中樞 的連線。 同樣地,您不需要包含應用程式的完整備份複本大小,或啟用故障轉移或復原的元件大小,以防損毀或無線更新的問題。
不過,在開發和偵錯期間,調試程式的大小會計入限制。 azsphere device enable-development 會自動新增調試程式,並由 azsphere device enable-cloud-test 移除。 您可以在 Microsoft Azure Sphere SDK 安裝目錄的 DebugTools 資料夾中搜尋 gdbserver.imagepackage,以尋找 SDK 所使用的調試程式大小。
如果應用程式映像套件和調試程式(如果有的話)超過 1 MiB 總計限制,azsphere device sideload 命令會傳回錯誤。 azsphere image add --image 命令會將新映射上傳至 Azure Sphere 租使用者,如果映像套件超過 1 MiB,也會傳回錯誤。
256 KiB RAM 限制僅適用於應用程式;您不需要允許除錯程式所使用的 RAM。 額外的記憶體會保留給核心配置。
針對針對目前 Azure Sphere 晶片 (MT3620) 所撰寫的應用程式,可用的快閃和 RAM 可能會增加(但永遠不會減少)。 未來的 Azure Sphere 晶片可能會有不同的限制。
記憶體不足狀況
如果您的應用程式使用太多 RAM,Azure Sphere OS 會以 SIGKILL 訊號終止它。 例如,在調試程式中,您會看到下列內容:
Child terminated with signal = 0x9 (SIGKILL)
如果高階應用程式收到SIGTERM要求之後無法結束,也會發生SIGKILL訊號。 如需詳細資訊,請參閱 應用程式的 生命週期。
若要協助避免因記憶體不足狀況而造成應用程式中損毀,請參閱 在高階應用程式中管理 RAM 使用量的最佳做法。
判斷運行時間應用程式 RAM 使用量
Azure Sphere 提供數個函式,可在運行時間取得記憶體使用量資訊。 您可以使用這些來監視高階應用程式的記憶體使用量,讓您在記憶體使用量超過您在 256 KiB 限制內指定的閾值時安全地重新啟動應用程式。 可用函式包括:
- Applications_GetTotalMemoryUsageInKB:取得以kibibytes為單位的總記憶體使用量。 這是系統上應用程式的總物理記憶體使用量,包括代表您的應用程式或偵錯伺服器傳回的核心配置(例如套接字的緩衝區),以原始值傳回(在 KiB 中)。
- Applications_GetUserModeMemoryUsageInKB:取得以kibibytes為單位的使用者模式記憶體使用量。 這是應用程式直接使用的實體記憶體數量、代表任何連結庫使用的記憶體(也稱為 anon 配置),以及偵錯伺服器所使用的記憶體,以原始值傳回(在 KiB 中)。
- Applications_GetPeakUserModeMemoryUsageInKB:取得 kibibytes 中的尖峰使用者模式記憶體使用量。 這是目前會話中使用的用戶記憶體數量上限。 測試應用程式的記憶體使用量時,您應該確保此值永遠不會超過 256 KiB。 每當您的應用程式重新啟動或重新部署時,這個值就會重設。 使用此函式來大致瞭解您的應用程式接近 256 KiB 的建議限制。
若要在高層級應用程式中使用這些函式,請包含applications.h頭檔。 您可以在開發期間使用這些函式來瞭解應用程式的整體記憶體使用量,但您也可以將它們與記錄一 起使用,從字段中的裝置擷取資訊。 記憶體 過度使用偵測和清除代碼段 示範如何偵測並正常處理非預期的記憶體使用量。
注意
這些函式會傳回OS所見的記憶體使用量。 目前,這些函式不會報告應用程式在用戶堆積上配置時釋放記憶體。 記憶體將會傳回 malloc 連結庫以供日後使用,但 OS 所報告的統計數據會保持不變,除非操作系統本身已配置並釋放記憶體。 例如,配置套接字的記憶體。 因此,這些函式有助於瞭解最壞的情況,以協助應用程式保守地運作,以達到最大可靠性。 值是近似值,而且可能會因操作系統版本而異。
新增堆積記憶體配置追蹤
您可以藉由新增 堆積記憶體配置追蹤來取得額外的記憶體使用量資訊,其中顯示靜態和動態連結庫正在進行哪些使用者和核心配置。 這可讓您更全面地瞭解應用程式所使用的記憶體,以協助您更有效地使用它。 這項功能適用於 Azure Sphere OS 21.07 版或更新版本,以及應用程式運行時間版本 (ARV) 10 或更新版本,僅適用於已啟用開發功能的裝置,而且只有在應用程式 未 在調試程式下執行時。
注意
您必須完成本節所述的設定工作,堆積記憶體配置追蹤才能正常運作。 如果您無法這麼做,編譯期間將會報告警告,而且不會顯示堆積記憶體資訊。
若要啟用堆積記憶體配置追蹤,您需要執行兩件事:
將 HeapMemStats 功能新增至應用程式的 app-manifest.json檔案:
"Capabilities": { "HeapMemStats": true },
將 libmalloc 連結庫新增至應用程式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' 行。
- 從
azsphere_target_add_image_package(${PROJECT_NAME} DEBUG_LIB "libmalloc"
應用程式CMakeLists.txt檔案中的 命令中移除DEBUG_LIB "libmalloc"
。
使用 Visual Studio 效能分析工具
如果您使用 Visual Studio,您可以使用其效能分析工具功能來取得應用程式記憶體使用量的相關信息。 如需使用此分析工具的教學課程,請參閱 Tutorials/MemoryUsage。
必要條件
- 聯機到執行 Visual Studio 且已安裝 Azure Sphere SDK 之電腦的 Azure Sphere 開發工具包。 請參閱 安裝適用於 Windows 的 Azure Sphere SDK。
- 準備用於開發的裝置。 請參閱 azsphere device enable-development。 如果您的裝置未啟用開發,效能分析工具將不會傳回數據。
啟動記憶體使用量分析工具
選取 [偵錯效能分析工具],或按 Alt+F2 開啟效能分析工具開始視窗。>
在 [分析目標] 下,如果看不到 Azure Sphere 裝置分析工具,請選取 [選擇目標],然後選取 [Azure Sphere 裝置分析工具]。
在 [可用的工具] 下,確定已核取 [Azure Sphere 記憶體使用量],然後選取 [開始] 以開啟記憶體使用量分析窗口,然後啟動記憶體分析工具。
如果您需要部署或重新啟動應用程式,請選取 >[偵錯啟動但不偵錯],或按 Ctrl+F5 將應用程式部署至裝置。
重要
若要取得應用程式的準確 RAM 使用量資訊,請務必 [啟動您的應用程式 但不 偵錯](buid-hl-app.md#build-and-deploy-the-application-in- visual-studio-without-debugging)。 在調試程式下執行您的應用程式會導致 RAM 使用量增加,因為偵錯伺服器耗用的記憶體將會包含在回報的 RAM 使用量統計數據中。
解譯記憶體使用量分析工具數據
記憶體使用量分析視窗會顯示如下的檢視:
在檢視的中心, Azure Sphere 裝置實體記憶體 圖表會在您的應用程式執行時繪製三個不同的 RAM 使用量統計數據(如最接近 KiB 所示) 做為三條不同的行:
- 總計: 系統上應用程式的總物理記憶體使用量,包括代表您的應用程式或偵錯伺服器的核心配置(例如套接字緩衝區)。
- 使用者: 應用程式直接使用的實體記憶體數量、代表其使用之任何連結庫所使用的記憶體數量(也稱為 anon 配置),以及偵錯伺服器所使用的記憶體。
- 尖峰使用者: 目前會話中使用的用戶記憶體數量上限。 測試應用程式的記憶體使用量時,您應該確保此值永遠不會超過 256 KiB。 額外的記憶體會保留給核心配置。 每當您的應用程式重新啟動或重新部署時,這個值就會重設。
此圖表也會繪製新尖峰事件的出現次數(以三角形表示)。 每當尖峰用戶記憶體使用量有新的最大值時,就會發生此事件。 事件已啟用螢幕助讀程序輔助功能。
如果您已啟用 堆積記憶體配置追蹤 ,且應用程式未在調試程式下執行,您會看到顯示堆積記憶體統計數據的其他圖表:
- 堆積總計:由或代表您的應用程式配置的堆積記憶體總計,包括來自靜態和動態連結庫。
- 共用連結庫堆積:來自 Azure Sphere OS 所提供動態連結庫的配置。
在圖表上方,時間軸檢視會顯示應用程式的運行時間,與下圖上的數據相互關聯。 使用 [放大 ] 和 [縮小 ] 將焦點放在特定時段。
圖表下方的數據表檢視會顯示相同的記憶體統計數據和事件。
提示
若要將數據從數據表複製到剪貼簿,請按 Ctrl+A 以選取所有數據列,然後按 Ctrl+C。
本節中顯示的前兩個圖表是在執行 記憶體使用量教學課程的階段 1 時拍攝的,其中包含記憶體流失。 記憶體使用量在每個圖表中單調地攀升,為洩漏提供視覺辨識項。 修正流失時,如同記憶體 使用量教學課程的第 2 階段,圖表會隨著記憶體的配置和解除分配而上升和下降。
檢視記憶體使用量總計的統計數據
azsphere device app show-memory-stats 命令會針對附加裝置上執行的應用程式,傳回記憶體使用量總計、使用者模式使用量和尖峰使用者模式使用量統計數據。 裝置必須設定 appDevelopment 裝置功能,才能執行此命令。
應用程式執行時顯示的 RAM 使用量統計資料如下:
- 總計(核心 + 使用者模式):系統應用程式的總物理記憶體使用量,包括代表您的應用程式或偵錯伺服器的核心配置(例如套接字緩衝區)。
- 使用者模式:應用程式直接使用的實體記憶體數量、代表其使用之任何連結庫所使用的記憶體數量(也稱為 anon 配置),以及偵錯伺服器所使用的記憶體。
- 尖峰使用者模式:目前會話中使用的用戶記憶體數量上限。 測試應用程式的記憶體使用量時,您應該確保此值永遠不會超過 256 KiB。 額外的記憶體會保留給核心配置。 每當您的應用程式重新啟動或重新部署時,這個值就會重設。
如果您已啟用 堆積記憶體配置追蹤 ,且應用程式未在調試程式下執行,您會看到其他幾行堆積記憶體統計數據:
- 堆積:應用程式 + 靜態庫:來自程式代碼的核心和使用者配置,以及以靜態方式連結至它的任何連結庫。
- 堆積:動態連結庫配置>:<Azure Sphere OS 所提供的個別動態連結庫配置。
持續監視記憶體使用量
若要監視一段時間的記憶體使用量,您可以使用腳本在迴圈中執行 azsphere device app show-memory-stats 命令,如下列範例所述:
Windows 命令提示字元
使用 [記事本] 或其他文本編輯器,使用下列內容建立批次腳本檔案memuse.bat:
@echo off
:loop
call azsphere 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) {
azsphere device app show-memory-stats
Start-Sleep -Seconds 1
}
記憶體使用量和調試程式
在調試程式下執行您的應用程式時,回報的記憶體統計數據也會包含偵錯伺服器進程的記憶體使用量,以及偵錯所造成的其他記憶體使用量,例如設定斷點。 基於這個理由,您應該在嘗試收集精確的記憶體統計數據時,一律執行應用程式而不進行偵錯。
不過,如果您使用調試程式執行應用程式,則使用記憶體使用量分析工具可能會很有用。 在觀察記憶體耗用量的相對變更時設定斷點和逐步執行程式代碼行,是識別記憶體使用量尖峰或記憶體流失原因的實用技術。
在 Visual Studio 中偵錯時,效能分析工具會自動開啟,但不會顯示堆積記憶體配置追蹤。