Я играл некоторое время с разными сборками моего приложения, и там, кажется, происходят странные вещи:
мое приложение имеет 5-миллиметровый простоя. при сохранении загрузки файловой памяти в размере файла. после загрузки зарезервированная память должна быть освобождена. теперь есть различия в сборках (gc = сборщик мусора):
- 32bit i386 no-GC: вся память мгновенно освобождается.
- 32bit i386 GC: почти вся память мгновенно освобождается. остальные через некоторое время.
- 64-битный x86_64 no-GC: минимальная память освобождается. как 10%
- 64bit x86_64 GC: память вообще не освобождается. память хранится в течение нескольких часов. (активность mon)
Я использую LLVM с CLANG. я все время работал с инструментами и проверял наличие утечек/зомби/и т.д. и все кажется чистым. (приложение довольно простое.)
Есть ли объяснение этого поведения?
Update:
Что-то странное. Я задал эту проблему:
Я загружаю файл 20mb в NSData и освобождаю его. Я делаю это без всякой сборки мусора. Код:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
Когда я создаю для i386 32bit, 20mb выделяются и освобождаются. Когда я переключаю сборку на 64-битный x86_64, релиз ничего не делает. Осталось 20 мб.
top pic 32bit lower 64 http://kttns.org/zguxn
Нет никакой разницы между двумя приложениями, кроме того, что верхняя часть построена для 32-битной, а нижняя - 64 бит. Не работает GC. (При включенной GC появляется такая же проблема.)
Обновление 2:
Такое же поведение наблюдается при создании нового приложения cocoa с нуля только с верхним кодом в applicationDidFinishLaunching:. В 64-битном режиме память не отпущена. i386 работает как ожидалось.
Аналогичная проблема возникает с NSString вместо NSData. Он также появляется, когда я загружаю 64-битное ядро. (Удерживание 64 при запуске.)
OS - 10.6.0