[英]Memory management in Swift: memory don't released after NSOperation ends
有人可以澄清一下Swift的內存管理嗎?
我有以下app代表:
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private let _queue = NSOperationQueue()
func applicationDidFinishLaunching(aNotification: NSNotification) {
_queue.maxConcurrentOperationCount = 1
_queue.addOperation(Operation())
_queue.addOperation(Operation())
_queue.addOperation(Operation())
}
}
private class Operation: NSOperation {
override func main() {
autoreleasepool {
var d = [String: AnyObject]()
for i in 1...1000 {
d[i.description] = Repeat(count: 10000, repeatedValue: "ABCDEF").joinWithSeparator("") // tested with repeat or just large string
}
d.removeAll()
}
}
}
應用程序啟動后,我將三個同步操作排入隊列。 每個操作只創建非常大的字典(struct),包含非常大的字符串(也是結構)。
由於所有創建的數據都是值類型而沒有捕獲任何內容,我相信當main函數結束時應該釋放內存 。 事實上,我添加了d.RemoveAll()
以防萬一發布內存。
完成所有操作后,Activity Monitor會顯示以下信息:
我的應用程序仍然占用26.7mb但如果我刪除所有_queue.addOperation(Operation())
它將約為7mb 。 為什么在所有操作完成后還沒有釋放額外的19mb內存?
@Lou Franco我改變了app delegate
func applicationDidFinishLaunching(aNotification: NSNotification) {
for _ in 1...100 {
_queue.addOperation(Operation())
}
}
現在8個操作同時運行。 完成所有操作后約40mb左右無人回收。 我試圖排隊100000次操作 。 應用程序不會崩潰40分鍾。 它的內存使用量為600 ... 1000mb ,但我無法等到所有操作完成。
你沒有泄漏。 該過程不會立即將所有內存返回給操作系統 - 這將非常浪費且昂貴。 內存返回到malloc
空閑內存列表。
運行測試代碼我實際上看到內存爬升然后在每個操作完成后丟棄。
我還懷疑,在碎片化的情況下,內存不會返回給操作系統(某些對象在大量空閑字節之間仍然存在)。 您的示例的這個變體達到幾百MB的高水位標記,然后在操作完成時回落到13.8。 通過分配連續的緩沖區,我們知道將有大量的大塊准備好返回給操作系統。
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private let _queue = NSOperationQueue()
func applicationDidFinishLaunching(aNotification: NSNotification) {
_queue.maxConcurrentOperationCount = 1
_queue.addOperation(Operation())
_queue.addOperation(Operation())
_queue.addOperation(Operation())
}
}
private class Operation: NSOperation {
override func main() {
autoreleasepool {
let count = 100000000
let p = UnsafeMutablePointer<Int>.alloc(count)
for i in 0..<count {
p.advancedBy(i).initialize(i)
}
p.destroy(count)
p.dealloc(count)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.