我正在使用 Allocations 來分析我的應用程式以查看它是否有任何記憶體問題。每次單擊“標記生成”時,我都會獲得一個新的記憶體快照,并且可以看到兩代期間記憶體增加了多少。但是,增長值總是會減少幾秒鐘,直到停止,我對此感到很困惑。有時最初的增長可能超過 20MB,但最終會下降到幾百 KB 左右。為什么會這樣,我應該信任哪個值?
編輯:這是我的截圖。

uj5u.com熱心網友回復:
我建議您根本不要關注“世代”串列及其“成長”列。它里面有很多噪音(例如,背景中有很多東西)并且沒有捕捉到一些顯著的資訊。
考慮以下。我分析了一個重復分配和釋放一個巨大的 70mb 陣列的應用程式。我標記A代,然后分配70mb陣列,標記B代,釋放陣列,標記C代,再次分配巨大陣列,標記D代,再次釋放,然后標記E代:

分配圖準確地說明了我在應用程式中所做的事情,但“世代”串列卻沒有。它告訴我 D 代增長了 26.95kb,盡管實際記憶體使用量增加了 70mb!
通常更有用的是“分配”圖。這里我將選擇從 C 代到 D 代的區間:

當切換到分配串列并按大小降序排序時,我現在看到了我的大陣列分配。我什至看到了分配發生位置的堆疊跟蹤Foo.init。這確實是進行分配的地方:
class Foo {
let values = Array(0 ..< 10_000_000)
}
class ViewController: NSViewController {
var foo: Foo?
@IBAction func didTapCreate(_ sender: Any) {
foo = Foo()
}
@IBAction func didTapRelease(_ sender: Any) {
foo = nil
}
}
我承認大多數分配問題都不是那么容易找到的。我通過做一個巨大的分配來表現出一個容易發現的問題。因為對分配進行逆向工程非常困難,除非我正在處理不安全的指標和手動分配的緩沖區,否則我的第一行調查通常是 Xcode 的“除錯記憶體圖”(參見https://stackoverflow.com/a/30993476/1271826)。
我還建議觀看 WWDC 2021 視頻檢測和診斷記憶體問題,并查看該頁面上的各種其他鏈接。它描述了許多非常先進的技術。
關于前幾代“增長”值的變化,可以肯定地說,只要“增長”具有價值,就可以放心地假設最終值更可靠。隨著 Instruments 趕上所有記錄的事件,實時儀器日志記錄(與“延遲”日志記錄相反)經常更新以前的圖表和值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/488280.html
