19

私はWeakReferenceが大好きです。しかし、参照がどの程度弱いと見なすか (たとえば、1 から 5 のスケールで) を CLR に伝える方法があればいいのにと思います。それは素晴らしいことです。

JavaにはSoftReference、WeakReferenceがあり、「ファントム参照」と呼ばれる3番目のタイプもあると思います。これは、そのオブジェクトがチョップを取得するかどうかを決定するときに、GC が異なる動作アルゴリズムを持っている 3 つのレベルです。

.NET の WeakReference をサブクラス化して (幸いなことに、それは封印されていません)、有効期限タイマーなどに基づく疑似 SoftReference を作成することを考えています。

4

9 に答える 9

19

NET にソフト参照がない根本的な理由は、仮想メモリを備えたオペレーティング システムに依存できるためだと思います。Java プロセスは最大 OS メモリを指定する必要があり (例: を使用-Xmx128M)、それ以上の OS メモリを使用することはありません。一方、NET プロセスは、必要な OS メモリを使用し続けますが、RAM が不足すると、OS はディスクでバックアップされた仮想メモリを提供します。NET でソフト参照が許可されている場合、NET ランタイムは、OS を深く覗いてそのメモリが実際にディスク上でページングされているかどうかを確認するか (厄介な OS/CLR 依存関係)、またはランタイムに解放するように要求しない限り、それらを解放するタイミングを知りません。最大プロセス メモリ フットプリントを指定します (例: と同等-Xmx)。マイクロソフトは追加したくないと思います-Xmxこれは、プロセス自体ではなく、OS が (RAM またはディスク上に保持する仮想メモリ ページを選択することによって) 各プロセスが取得する RAM の量を決定する必要があると考えているためです。

于 2011-08-18T04:21:05.320 に答える
12

Java SoftReferences は、メモリーに依存するキャッシュの作成に使用されます (他の目的には使用されません)。

.NET 4 の時点で、.NET にはクラスSystem.Runtime.Caching.MemoryCacheがあり、おそらくそのようなニーズを満たすでしょう。

于 2012-09-15T17:20:21.277 に答える
5

さまざまなレベルの弱点 (優先度) を持つ WeakReference を持つことはいいことのよう に思えますが、GC の仕事は簡単ではなく難しくなる可能性があります。(GC の内部についてはわかりませんが、GC が効率的にクリーンアップできるように、WeakReference オブジェクトに対して保持される何らかの追加のアクセス統計があると思います (たとえば、使用頻度の低いアイテムを取り除く可能性があります)。最初)。

最も効率的な方法は、使用頻度の低い WeakReferences を最初に取り除くことであるため、複雑さが増しても効率が向上することはほとんどありません。優先順位を付けることができるとしたら、どのようにしますか? これは、時期尚早の最適化のように思えます。プログラマーはほとんどの場合、実際にはわからず、推測しています。その結果、GC コレクション サイクルが遅くなり、間違ったオブジェクトを再利用する可能性があります。

ただし、WeakReference.Target オブジェクトが再利用されることを気にしている場合、それは本当に WeakReference の適切な使用法でしょうか?という疑問が生じます。

キャッシュのようなものです。キャッシュに何かを押し込んで x 分後にキャッシュを古くするように要求しますが、ほとんどのキャッシュはそれを保持することをまったく保証しません。その場合、要求されたポリシーに従って期限切れになることを保証するだけです。

于 2008-11-28T01:13:19.920 に答える
4

なぜこれがまだ存在しないのかについての私の推測は単純です。ほとんどの人は、リファレンスが 4 種類ではなく 1 種類しかないことを美徳と呼ぶと思います。

于 2008-11-27T20:57:41.697 に答える
3

おそらく、ASP.NET キャッシュ クラス (System.Web.Caching.Cache) が目的を達成するのに役立つでしょうか? メモリが少なくなると、オブジェクトを自動的に削除します。

これは、Windows フォーム アプリケーションで Cache クラスを使用する方法を示す記事です。

引用元:.netのSoftReferenceと同等?

于 2010-02-18T17:13:03.277 に答える
2

標準のリファレンス(日常的に使用するもの)もあることを忘れないでください。これにより、もう1つのレベルが得られます。

WeakReferencesは、オブジェクトがなくなるかどうかを気にしない場合に使用する必要があります。SoftReferencesは、通常の参照を使用する場合にのみ使用する必要がありますが、メモリが不足するようにオブジェクトをクリアする必要があります。詳細はわかりませんが、GCは通常SoftReferencesをトレースしますが、ライブのオブジェクトを判別するときにWeakReferencesをトレースしないと思いますが、メモリが不足するとSoftReferencesもスキップされます。

私の推測では、.Netの設計者は、違いがほとんどの人にとって混乱していると感じていたり、SoftReferencesが実際に望んでいたよりも複雑さを増していると感じたため、除外することにしました。

As a side note, AFAIK PhantomReferences are mostly designed for internal use by the virtual machine and are not intended for actual client use.

于 2009-01-19T17:06:14.697 に答える
1

おそらく、オブジェクトが収集される前にどの世代を指定できるプロパティがあるはずです。したがって、1 を指定すると、可能な限り最も弱い参照になります。ただし、3 を指定した場合、コレクション自体と見なされる前に、少なくとも 3 回前のコレクションを生き残る必要があります。

その時までにオブジェクトはすでにファイナライズされているため、トラック復活フラグはこれには適していないと思いましたか? 間違っているかもしれませんが...

(PS:私はOPです。サインアップしたばかりです。「未登録」アカウントから履歴を継承しないというPITA。)

于 2008-11-27T21:12:43.197 に答える
0

.NETにSoftreferencesがない理由がわかりません。しかし、JavaのSoftreferencesは私見で酷使されています。その理由は、少なくともアプリケーションサーバーでは、Softreferenzenの存続期間をアプリケーションごとに影響を与えることができるようにするためです。これは現在Javaでは不可能です。

于 2009-01-19T16:37:18.170 に答える
0

おそらくコンストラクタに渡された「trackResurrection」オプションをお探しですか?

GC クラスもいくつかの支援を提供します。

于 2008-11-27T21:03:18.020 に答える