Instruments не показывает утечек или потерянных объектов, но память приложения увеличивается и выравнивается при последующих запусках

#swift #xcode #macos #memory-management #memory-leaks

#swift #xcode #macos #управление памятью #утечки памяти

Вопрос:

Я использую XCode 8.0; Swift 3.0. Я пишу приложение для macOS, которое создает массив объектов, где каждый объект имеет свойство, представляющее собой большой массив [Int] (то есть массив массивов Int ). Каждый объект в массиве передается в отдельный поток для некоторых математических операций. Вот как выглядит определение класса:

 class SearchBot {

private let BLOCKSCALE = 0.05 // Report progress for each 5%
private var head, start, end, index, size, blockSize : Int
private var doneLoading : Bool
var blocksChunked : Int
var listArray : [[Int]]

init (beginningHere b : Int, andEndingHere e : Int) {

    head = b
    start = b
    end = e
    size = end - start   1
    listArray = Array<[Int]>(repeating: [0,0], count: size)
    index = 0
    blockSize = Int(Double(size) * BLOCKSCALE)
    blocksChunked = 0
    doneLoading = false

}
  

После создания массива поисковых роботов, размер списков в каждом из которых составляет ~ 1 миллион записей, я публикую некоторые результаты. Программа работает именно так, как я намереваюсь, и после запуска:

  • Instruments не показывает утечек
  • Instruments не показывает аномалий выделения и моментальных снимков поколения при запуске программы; запуск нескольких сценариев; моментальные снимки при завершении программы теперь показывают необычный рост памяти
  • График памяти XCode не показывает сирот и утечек

но….

Индикатор памяти XCode (показан ниже) показывает, что объем программы увеличивается с ~ 20 МБ при запуске программы до ~ 211 МБ после нескольких запусков. Странно то, что она просто остается ~ 211MB. При последующих запусках она немного увеличивается, но по завершении возвращается к новому «уровню» в 211 МБ. Я наблюдаю то же самое в Activity Monitor, даже когда я архивирую программу в двоичный файл и запускаю ее оттуда.

Индикатор памяти в XCode

Индикатор памяти в XCode

Я не думаю, что я фиксирую self закрытие, когда отправляю каждый элемент массива в отдельный поток (он не отображается на графике памяти), но я попробовал [unowned self] in закрытие на всякий случай, и результаты были одинаковыми с ним или без него.

Я где-то читал, что в мире ARC более поздних версий OS X (macOS) система фактически удерживает освобожденную память из приложения (вроде как кэширует ее), исходя из предположения, что ваша программа может захотеть вернуть ее при последующих запусках. Он действительно освобождает его только тогда, когда память начинает испытывать давление.

Это то, что происходит?

Большое спасибо!

Комментарии:

1. Здесь явно недостаточно, чтобы мы могли диагностировать, что происходит. Мы не можем комментировать ваш вывод о том, что нет ни «аномалий распределения», ни «сирот», ни «утечек», не зная, как вы пришли к этим выводам (часто люди делают неправильные выводы, хотя я и не говорю, что вы). Сказав это, общее поведение очень похоже на кэшированную память (хотя в вашем фрагменте кода ничего подобного нет). Повторите ваш заключительный абзац о том, как он зависает в памяти, нет, ваши распределения и поведение с измерителем памяти не связаны ни с чем подобным.

2. Большое спасибо, что нашли время, чтобы прочитать это. Совет о показателе памяти действительно полезен. Прошу прощения за отсутствие подробностей в публикации, что я воспринимаю как признак того, что мне есть чему поучиться. Я собираюсь вернуться назад и использовать урезанную версию моей программы и создавать ее поэтапно, попутно проверяя проблемы с памятью (должно было начаться там). Я уверен, что неправильно читаю график памяти и / или инструменты, и ответ, вероятно, смотрит мне в лицо. Я уверен, что путешествие сделает меня сильнее 🙂 Еще раз спасибо!

3. Кстати, видеоролики WWDC довольно хороши. Устранение проблем с памятью — это хорошее общее обсуждение. Для обсуждения новой функции графа памяти отладки см. Последнюю часть визуальной отладки с помощью Xcode . Тем не менее, первое видео, хотя и устаревшее, содержит гораздо лучшее описание более широкого спектра проблем с памятью.

4. Фантастические видеоролики. Спасибо!