ガベージコレクションの理由は、メモリ管理がプログラマーの明示的な制御下にあるCのような言語では、オブジェクトの所有権が、特にスレッド間、またはさらに難しいことに、メモリを共有するプロセス間で渡されるときに、メモリリークを回避するためです。ダングリングポインタは非常に難しくなる可能性があります。それが十分に難しい場合は、一度にメモリに収まるよりも多くのオブジェクトにアクセスする必要性にも対処する必要があります。他のオブジェクトができるように、しばらくの間一部のオブジェクトを解放する方法が必要です。メモリに入れることができます。
そのため、一部の言語(Perl、Lisp、Javaなど)は、オブジェクトの「使用」を停止できるメカニズムを提供し、ガベージコレクターは最終的にこれを検出して、オブジェクトに使用されているメモリを解放します。プログラマーがそれを間違える可能性のあるすべての方法を心配することなく、これを正しく行います(プログラマーがこれを台無しにする方法はたくさんありますが)。
オブジェクトにアクセスする回数に、オブジェクトの値を計算するのにかかる時間を概念的に掛けると、オブジェクトをすぐに利用できない場合のコストや、メモリ内の大きなオブジェクトは、いくつかの小さなオブジェクトを保持することを妨げる可能性があります。オブジェクトを3つのカテゴリに分類できます。
一部のオブジェクトは非常に重要であるため、それらの存在を明示的に管理する必要があります。それらはガベージコレクターによって管理されないか、明示的に解放されるまで収集されないようにする必要があります。一部のオブジェクトは、計算が安価で、小さく、頻繁にアクセスされないか、いつでもガベージコレクションできる同様の特性を備えています。
3番目のクラスは、再計算にコストがかかるが再計算できるオブジェクトであり、ある程度頻繁に(おそらく短時間のバーストで)アクセスされ、サイズが大きいなど、3番目のクラスです。それらは再利用される可能性があるため、できるだけ長くメモリに保持したいが、重要なオブジェクトに必要なメモリが不足したくない。これらは弱参照の候補です。
重要なリソースと競合しない場合は、これらのオブジェクトをできるだけ長く保持する必要がありますが、重要なリソースにメモリが必要な場合は、必要に応じて再計算できるため、これらのオブジェクトを削除する必要があります。これらは、弱いポインタが対象です。
この例としては、写真があります。何千枚もの写真を表示する写真のWebページがあるとします。レイアウトする画像の数を知る必要があり、リストを取得するためにデータベースクエリを実行する必要があるかもしれません。数千のアイテムのリストを保持するためのメモリはおそらく非常に小さいです。クエリを一度実行して、それを維持したいとします。
ただし、Webページのペインには、一度に数十枚の写真しか物理的に表示できません。ユーザーが見ることができない写真のビットをフェッチする必要はありません。ユーザーがページをスクロールすると、表示されている画像の実際のビットが収集されます。それらの写真を表示するには、数メガバイトが必要になる可能性があります。ユーザーがいくつかのスクロール位置の間を前後にスクロールする場合、それらのメガバイトを何度も再フェッチする必要はありません。ただし、すべての写真を常にメモリに保存することはできません。したがって、弱いポインタを使用します。
ユーザーが数枚の写真を何度も何度も見た場合、それらはキャッシュに残っている可能性があり、あなたはそれらを再フェッチする必要はありません。ただし、十分にスクロールする場合は、表示されている画像を取得できるように、メモリを解放する必要があります。弱参照では、使用する直前に参照をチェックします。それでも有効な場合は、それを使用します。そうでない場合は、それを取得するために高価な計算(フェッチ)を行います。