質問: ガベージコレクションは参照カウントとどのように違いますか? appleの新しい言語であるswiftによるios開発に関するオンラインコースに取り組み始めました。講師はこの疑問を私の頭に浮かび上がらせました。彼は次の影響について何かを述べました: 参照カウントによってすべてが処理されるため、メモリ管理について心配する必要はありません。これは、ガベージコレクションがどのように機能するかを理解することについて心配する必要がないことを意味します。 これを聞いたとき、「単純に参照カウントを使用できるのに、なぜガベージコレクションを使用するのか」と思いました。それでは、2つのアプローチをどのように比較しますか?
回答: 手動のメモリ管理、参照カウント、およびガベージコレクションには、それぞれ長所と短所があります。 手動メモリ管理:非常に高速ですが、メモリの解放エラーが原因でバグが発生しやすくなります。また、単一のオブジェクトが存続し続ける必要のある複数のオブジェクトを取得した場合は、多くの場合、手動のメモリ管理に加えて、少なくとも参照カウントを自分で実装する必要があります。 参照カウント:小さなオーバーヘッド(カウンターのインクリメント/デクリメントとゼロチェックはそれほど高価ではありません)により、非常に複雑なデータ構造の管理が容易になり、すべてのオブジェクトが他のオブジェクトによって参照される場合があります。欠点は、参照カウントでは参照が循環的でないことを要求することです。参照サークルを取得すると、メモリがリークします。 弱い参照は、いくつかの参照サイクルを打破するために使用できますが、かなりの追加コストが伴います。 弱い参照は、弱い参照自体を管理するために2番目の参照カウントを必要とします。おそらく、弱参照は独立して割り当てる必要がある別のオブジェクトであり、メモリ消費量に大きなオーバーヘッドが発生します。 弱参照が存在する状態でオブジェクトを破棄するには、オブジェクトに属する弱参照をアトミックにリセットし、参照カウントをデクリメントする必要があります。そうしないと、弱参照の動作が不安定になります。詳細には詳しくありませんが、ロックフリーの方法でこれを実現するのは難しいと思います。 これはすべて実行できますが、弱い参照がないと参照カウントほど簡単ではありません。 ガベージコレクション:考えられるすべての依存関係グラフに対応できますが、パフォーマンスにかなりの影響があります。結局、ガベージコレクターは、オブジェクトを収集する前に、オブジェクトに到達できないことを何らかの方法で証明する必要があります。現代のガベージコレクターは、作業中に長い遅延を回避するのに非常に優れていますが、作業は何らかの形で行う必要があります。これは、特定の時間枠内での応答を保証する必要があるリアルタイムアプリケーションでは特に悪いことです。 ご覧のとおり、3つの方法にはすべて最適な状況があります。手動での管理が簡単で、プログラムのパフォーマンスに厳しい制約がある場合は、手動でのメモリ管理が適しています。また、ガベージコレクションに対して参照カウントを使用できる限り、これはかなり高速であり、偽の遅延は発生しません。それでも、サイクルフリーの参照を保証できないため、ガベージコレクションを使用する必要がある場合があります。すべてにガベージコレクションを使用する言語は、パフォーマンスに敏感なアプリケーションを許可するよりも、使いやすさが重要であると判断しました。