アプリケーションの異なるビルドをしばらく再生していて、奇妙なことが起きているようです。カカオ64ビットバイナリリークメモリ? (NSDataを解放するとメモリが解放されません)
私のアプリのアイドルフットプリントは5メガバイトです。ファイルのアップロード時にファイルサイズのメモリが予約されます。アップロード後、予約されたメモリを解放する必要があります。
- 32ビットのi386無GC::すべてのメモリが即座に解放され、今のビルド(GC =ガベージコレクタ)に違いがあります。
- 32ビットi386 GC:ほぼすべてのメモリが即座に解放されます。残りの時間は後である。
- 64bit x86_64 no-GC:最小限のメモリが解放されます。 like 10%
- 64bit x86_64 GC:メモリが全く解放されません。メモリは何時間も予約されています。 (活動モン)
私はCLANGでLLVMを使っています。今日はいつも楽器を走っていて、リークやゾンビなどをチェックしていました。すべてがきれいであるようです。 (アプリはかなりシンプルです)
この現象の説明はありますか?
更新:
いくつかの奇妙なものです。私はこの問題を煮沸しました:
NSDataに20MBのファイルをロードしてリリースします。ガベージコレクションを有効にしないでこれをやっています。コードは:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
i386 32ビット用にビルドすると、20MBが割り当てられ、解放されます。ビルドを64bit x86_64に切り替えると、リリースは何もしません。 20MBの滞在が割り当てられます。
upper pic 32bit lower 64 http://kttns.org/zguxn
上位1が32ビットと下位1つの64ビットのために構築されていることを除いて2つのアプリの違いはありません。 GCが実行されていません。 (GCが表示され、同じ問題を有効にすると。)
アップデート2:私はapplicationDidFinishLaunchingで唯一の上側のコードで最初から新しいココアアプリを作成するときに
同じ動作を観察することができ:. 64ビットモードでは、メモリは解放されません。 i386は期待どおりに動作します。
同じ問題がNSDataではなくNSStringで表示されます。 64ビットカーネルをブートすると表示されます。 (起動時に64に保持される。)
OSは、ガベージコレクタは、必ずしも直ちにメモリを解放しない10.6.0
NSDataインスタンスの割り当てを試して、割り当てを解除して、メモリそれらのいずれかが再生されていますか?メモリが不足していない限り、プログラムはメモリをOSに返さないことがあります。 – Amok
私はこれを運のない10.6で再現しようとしました。 テストアプリにバグを報告しましたか? – Ken
あなたのアプリは正しく動作しており、メモリが漏れていません。半詳細な説明については私の答えを参照してください。 – bbum