【发布时间】:2010-11-25 21:36:22
【问题描述】:
我已经使用不同版本的应用程序玩了一段时间,似乎发生了奇怪的事情:
我的应用有 5mb 的空闲空间。上传文件时保留文件大小的内存。上传后保留的内存应该被释放。现在构建有所不同(gc = 垃圾收集器):
- 32bit i386 no-GC:立即释放所有内存。
- 32bit i386 GC:几乎所有内存都会立即释放。过一段时间后剩下的。
- 64 位 x86_64 no-GC:释放的内存最少。像 10%
- 64bit x86_64 GC:根本没有释放内存。内存会保留几个小时。 (活动星期一)
我正在使用带有 CLANG 的 LLVM。我一直在运行今天的仪器,并检查泄漏/僵尸/等。一切似乎都很干净。 (该应用程序相当简单。)
对这种行为有解释吗?
更新:
这是一些奇怪的东西。我把问题归结为:
我将一个 20mb 的文件加载到 NSData 中并释放它。我在没有启用任何垃圾收集的情况下这样做。代码是:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
当我为 i386 32bit 构建时,20mb 被分配和释放。当我将构建切换到 64 位 x86_64 时,版本什么也不做。分配的 20mb 停留时间。
upper pic 32bit lower 64 http://kttns.org/zguxn
除了上一个是为 32 位构建的,而下一个是为 64 位构建的之外,这两个应用程序之间没有区别。没有 GC 正在运行。 (启用 GC 也会出现同样的问题。)
更新 2:
当我只使用 applicationDidFinishLaunching: 中的上层代码从头开始创建一个新的可可应用程序时,可以观察到相同的行为。在 64 位模式下,内存不会被释放。 i386 按预期工作。
同样的问题出现在 NSString 而不是 NSData 上。当我启动 64 位内核时,它也会出现。 (启动时保持 64。)
操作系统是 10.6.0
【问题讨论】:
-
您是否尝试过分配和释放大量 NSData 实例以查看它们中的任何一个的内存是否被回收?除非内存不足,否则程序可能不会将内存返回给操作系统。
-
我只是试图在 10.6 上重现这个,但没有运气。您是否为您的测试应用提交了错误?
-
您的应用程序运行正常并且没有泄漏内存。请参阅下面的答案以获得半详细的解释。
标签: objective-c cocoa memory-leaks 64-bit nsdata