我一直在使用我的应用程序的不同版本玩了一段时间,似乎发生了奇怪的事情:
我的应用有 5mb 的空闲空间。上传文件时保留文件大小的内存。上传后保留的内存应该被释放。现在构建存在差异(gc = 垃圾收集器):
- 32bit i386 no-GC:立即释放所有内存。
- 32bit i386 GC:几乎所有内存都会立即释放。剩下的一段时间后。
- 64bit x86_64 no-GC:释放最少的内存。像 10%
- 64 位 x86_64 GC:根本没有释放内存。内存会保留几个小时。(活动周一)
我将 LLVM 与 CLANG 一起使用。我今天一直在运行仪器并检查泄漏/僵尸/等。一切似乎都很干净。(该应用程序相当简单。)
这种行为有解释吗?
更新:
那是一些奇怪的东西。我把问题归结为:
我将一个 20mb 的文件加载到 NSData 中并释放它。我在没有启用任何垃圾收集的情况下这样做。代码是:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
当我为 i386 32bit 构建时,20mb 被分配和释放。当我将构建切换到 64 位 x86_64 时,版本什么也不做。分配的 20mb 停留。
上图 32bit 下 64 http://kttns.org/zguxn
这两个应用程序之间没有区别,只是上一个是为 32 位构建的,而下一个是为 64 位构建的。没有 GC 正在运行。(启用 GC 后会出现同样的问题。)
更新 2:
当我从头开始使用 applicationDidFinishLaunching: 中的上层代码创建一个新的可可应用程序时,可以观察到相同的行为。在 64 位模式下,内存不会被释放。i386 按预期工作。
NSString 而不是 NSData 也会出现同样的问题。当我启动 64 位内核时,它也会出现。(启动时保持 64。)
操作系统是 10.6.0