двоичные файлы какао 64 битов пропускают память? (выпускающий NSData не освобождает память),

Установка mysqlclient использование anaconda симпатична simple and straight forward.

conda install -c bioconda mysqlclient

и установка pymysql зернышко использования.

pip install pymqsql
13
задан 5 September 2009 в 22:46
поделиться

3 ответа

Во-первых, используйте инструмент Object Graph Instrument, чтобы убедиться, что память больше не считается используемой; где-то отсутствует счетчик сохраненных данных или сильная ссылка.

Если она больше не используется, значит, память остается, просто потому, что вы не достигли порогового значения, о котором заботится сборщик.

Однако это инструкция:

64bit x86_64 no-GC: минимальная память освобожден. вроде 10%

Меня настораживает. В частности, если ваш код предназначен для работы в не-GC - с сохранением / выпуском - то либо (а) у вас есть утечка памяти, и, если вы используете CFRetain или какой-то глобальный кеш, это может повлиять на GC, либо (b ) вы не используете правильные инструменты, чтобы выяснить, есть ли утечка памяти.

Итак, как вы определяете, что у вас утечка памяти?

Обновление ; вы используете Activity Monitor для отслеживания RSIZE / VSIZE процесса. На самом деле это не скажет вам ничего полезного, кроме «растет ли мой процесс с течением времени».

Скорее всего (я не смотрел исходный код), этот код:

NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigpoop"];

приведет к тому, что файл размером 20 МБ будет mmap () вошел в процесс. Здесь вообще не задействовано распределение в стиле malloc (). Вместо, ОС передает вашему процессу 20 МБ непрерывного адресного пространства и отображает в него содержимое файла. Когда вы читаете содержимое NSData, по ходу работы в файле будет отображаться ошибка страницы.

Когда вы отпускаете bla , отображение уничтожается. Но это не означает, что подсистема виртуальной машины собирается уменьшить адресное пространство вашего приложения на 20 МБ.

Итак, вы сжигаете кучу адресного пространства, но не фактическую память. Поскольку ваш процесс 64-битный, адресное пространство - это практически бесконечный ресурс, и использование адресов требует очень небольших затрат, поэтому ОС реализована таким образом.

Т.е. утечки нет, и ваше приложение работает правильно , GC или нет.

Это распространенное заблуждение, поэтому вопрос поставлен в звезду.

Когда вы читаете содержимое NSData, по ходу работы в файле будет отображаться ошибка страницы.

Когда вы отпускаете bla , отображение уничтожается. Но это не означает, что подсистема виртуальной машины собирается уменьшить адресное пространство вашего приложения на 20 МБ.

Итак, вы сжигаете кучу адресного пространства, но не фактическую память. Поскольку ваш процесс составляет 64 бита, адресное пространство - это практически бесконечный ресурс, и использование адресов требует очень небольших затрат, поэтому ОС реализована таким образом.

Т.е. утечки нет, и ваше приложение работает правильно , GC или нет.

Это распространенное заблуждение, поэтому вопрос поставлен в звезду.

Когда вы читаете содержимое NSData, по ходу работы в файле будет отображаться ошибка страницы.

Когда вы отпускаете bla , отображение уничтожается. Но это не означает, что подсистема виртуальной машины собирается уменьшить адресное пространство вашего приложения на 20 МБ.

Итак, вы сжигаете кучу адресного пространства, но не фактическую память. Поскольку ваш процесс 64-битный, адресное пространство - это практически бесконечный ресурс, и использование адресов требует очень небольших затрат, поэтому ОС реализована таким образом.

Т.е. утечки нет, и ваше приложение работает правильно , GC или нет.

Это распространенное заблуждение, поэтому вопрос поставлен в звезду.

Это означает, что подсистема виртуальной машины собирается уменьшить адресное пространство вашего приложения на 20 МБ.

Таким образом, вы сжигаете кучу адресного пространства, но не фактическую память. Поскольку ваш процесс составляет 64 бита, адресное пространство - это практически бесконечный ресурс, и использование адресов требует очень небольших затрат, поэтому ОС реализована таким образом.

Т.е. утечки нет, и ваше приложение работает правильно , GC или нет.

Это распространенное заблуждение, поэтому вопрос поставлен в звезду.

Это означает, что подсистема виртуальной машины сократит адресное пространство вашего приложения на 20 МБ.

Итак, вы сжигаете кучу адресного пространства, но не фактическую память. Поскольку ваш процесс 64-битный, адресное пространство - это практически бесконечный ресурс, и использование адресов требует очень небольших затрат, поэтому ОС реализована таким образом.

Т.е. утечки нет, и ваше приложение работает правильно , GC или нет.

Это распространенное заблуждение, поэтому вопрос поставлен в звезду.

10
ответ дан 2 December 2019 в 00:58
поделиться

Сборщик мусора не обязательно освобождает память немедленно.

В случае сборщика мусора Objective-C вы можете отправить объекту сборщика мусора Cocoa collectIfNeeded сообщение, чтобы предположить, что сейчас может быть подходящее время для некоторой сборки, или collectExhaustively , чтобы приказать ему немедленно начать сбор любого мусора (но даже это можно прервать). См. документы .

2
ответ дан 2 December 2019 в 00:58
поделиться

У меня очень похожая проблема в iPhoneOS 3.2, и я действительно не думаю, что память восстанавливается - в конце концов я срабатываю предупреждения о памяти. Есть небольшая вероятность, что я упустил из виду свою собственную ошибку, но я был очень внимателен.

Я использую unarchiveObjectWithFile NSKeyedUnarchiver: для загрузки настраиваемого объекта, который содержит один большой NSData и другой гораздо меньший объект. Вызывается метод dealloc в моем настраиваемом объекте, объект NSData освобождается, его keepCount == 1 непосредственно перед этим. Физическая память не уменьшается ни на какую величину, не говоря уже о доле размера NSData, и с повторением предупреждений о памяти надежно генерируются: у меня есть тест, пока я действительно не получу предупреждения уровня 2. = (

Перед выпуском:

(gdb) p (int) [(NSData *) pastItsWelcomeData keepCount]
$ 1 = 1

После выпуска:

(gdb) p (int) [(NSData *) pastItsWelcomeData keepCount]
Цель не отвечает на этот селектор сообщений.

0
ответ дан 2 December 2019 в 00:58
поделиться