簡體   English   中英

Swift中的內存管理:NSOperation結束后內存不會釋放

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM