2011-02-20 14 views
0

ファイルからオーディオデータを読み込んで処理するためにスレッドを切り離すまで、すべてのことがアプリケーションで正常に機能します。スレッドでガーベジコレクションが機能しないのはなぜですか?

ガベージコレクションは、私が何をしてもこのスレッドで何が起こるかについて何も知らないようです。私は[NSThread self]、[NSThread currentThread]、[NSGarbageCollector defaultCollector] collectIfNeeded]、およびcollectExhaustivly]を試しました。 NSThreadからNSOperationQueueでNSOperationに切り替えました。

これらの提案された解決策はどれも効果がありませんでした。最近では、私は私のデータを保持するために

Float32* pfArray= calloc(numFloats, sizeof(Float32));

にNSMutableArraysから切り替えて、そのメモリを解放する free(pfArray); を使用しました。これはよりうまくいっていますが、それでもまともな量が漏れています。

アクティビティモニターに表示された「実際のmem」が任意の数に達した後にガベージコレクションがある程度動作するように見えますが、動作しているように見える場合は、使用されているメモリをすべて解放しません。それは、それが任意のしきい値よりもはるかに高くなることはありません。

私はGCを使う方法を読んだことがありますが、今は私には分かりませんし、ほぼ完全に書かれたプログラムがあります。どんな提案も非常に役に立ちます。ありがとうございました!

答えて

5

ガベージコレクションは実際にはアプリケーションのすべてのスレッドで機能します。あなたは無意識のうちに、根本的なオブジェクトへの参照を保持して、サブグラフを漏らしているかもしれません。しかし、元のコードがなければ、それほど多くのことは言えません。

+2

デッドオン;コレクタはスレッドアプリケーションでうまく動作します。多くの場合、スレッド化されたアプリケーションでは非GCコードよりもはるかに効率的です。それ以上の証拠がなければ、あなたが間違ったことを言うのは難しいです。 – bbum

+0

私は、アンマネージメモリコール(mallocベース)と管理されたメモリコールを混在させている可能性がありますので、質問を再読み込みする必要があります。しかし元の情報源がなくても、相談するのは難しいです。 – millenomi

1

"collectIfNeeded"は、コレクションが必要ない場合は収集しないことを意味します。

InstrumentsのHeapshot機能(Allocations計測器の一部)を使用して、どのオブジェクトが生存しているかを確認し、Object Graph計測器を使用して、もはや不要と思われるオブジェクトを把握します。

+0

助けていただきありがとうございます。私はリークを塞いだが、プラグがなぜ機能するのかを完全には理解していない。私がプログラムの漏れを止めるための方法は、 '[NSOperation main]'コードから全てのallocs、malloc、callocを取り出すことでした。だから、GCはNSOperation内部の割り当てを追跡することができないようです。 – Mark

+0

@subby:GCはCocoaオブジェクトのみを追跡します。あなたが 'malloc'、' realloc'、または 'calloc'で割り当てたものは、あなたはまだ自由にしなければなりません。あなたは 'alloc'で作成したオブジェクトをどこに保存しましたか? –

+0

コンパイラに知らせるために '__strong'で使われる' void * 'をすべてマークすることを思い出す限り、GCのメモリを割り当てることができる低レベルの関数があります。 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.htmlの「NSAllocateCollectable」を参照してください。 – millenomi

関連する問題