私は自分のアプリケーションのさまざまなビルドでしばらく遊んでいますが、奇妙なことが起こるようです:
私のアプリには 5 MB のアイドル フットプリントがあります。ファイルをアップロードするとき、ファイルのサイズのメモリが予約されます。アップロード後、予約済みメモリを解放する必要があります。現在、ビルドに違いがあります (gc = ガベージ コレクター):
- 32bit i386 no-GC: すべてのメモリが即座に解放されます。
- 32 ビット i386 GC: ほとんどすべてのメモリが即座に解放されます。残りはしばらくしてから。
- 64bit x86_64 no-GC: 最小限のメモリが解放されます。10%くらい
- 64 ビット x86_64 GC: メモリはまったく解放されません。メモリは何時間も予約されたままになります。(活動月)
私はCLANGでLLVMを使用しています。私は今日ずっと楽器を走らせていて、リーク/ゾンビ/などをチェックしていました。すべてがきれいに見えます。(アプリはかなりシンプルです。)
この動作の説明はありますか?
アップデート:
それはいくつかの奇妙なものです。私はこれに問題を沸騰させました:
20MB のファイルを NSData にロードして解放します。ガベージコレクションを有効にせずにこれを行っています。コードは次のとおりです。
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
i386 32 ビット用にビルドすると、20 MB が割り当てられて解放されます。ビルドを 64 ビット x86_64 に切り替えると、リリースは何もしません。20MBは割り当てられたままです。
上の写真 32bit 下の写真 64 http://kttns.org/zguxn
上のアプリが 32 ビット用にビルドされ、下のアプリが 64 ビット用にビルドされていることを除いて、2 つのアプリに違いはありません。GC は実行されていません。(GC を有効にすると、同じ問題が発生します。)
更新 2:
applicationDidFinishLaunching: の上位コードのみを使用して新しいココア アプリをゼロから作成すると、同じ動作が観察されます。64 ビット モードでは、メモリは解放されません。i386 は期待どおりに動作します。
NSData ではなく NSString でも同じ問題が発生します。64 ビット カーネルを起動したときにも表示されます。(起動時は64保持)
OS は 10.6.0