我真的很喜欢WeakReference.但我希望有一种方法可以告诉CLR多少(比如说,在1到5的范围内)你认为参考的程度有多弱.那将是辉煌的.
Java有SoftReference,WeakReference,我相信第三种类型称为"幻像引用".这就是那里的3个级别,GC在决定该对象是否获得切割时具有不同的行为算法.
我正在考虑对.NET的WeakReference进行子类化(幸运的是,并且稍微有点不好意思,它没有密封)来创建一个基于到期计时器或其他东西的伪SoftReference.
我认为NET没有软引用的根本原因是因为它可以依赖具有虚拟内存的操作系统.Java进程必须指定其最大OS内存(例如,有-Xmx128M
),并且它永远不会占用更多的OS内存.而NET进程不断地占用它所需的操作系统内存,而当操作系统耗尽时,操作系统会提供磁盘支持的虚拟内存.如果.NET允许软引用,那么.NET运行时将不知道何时释放它们,除非它深入到操作系统以查看其内存是否实际在磁盘上分页(一个令人讨厌的OS/CLR依赖),或者它要求运行时指定最大进程内存占用量(例如等效值-Xmx
).我想微软不想添加-Xmx
到.NET,因为他们认为操作系统应该决定每个进程获得多少RAM(通过选择在RAM或磁盘上保存哪些虚拟内存页),而不是进程本身.
Java SoftReferences用于创建内存敏感的缓存(它们不用于其他目的).
从.NET 4开始,.NET有一个类System.Runtime.Caching.MemoryCache,它可能满足任何这样的需求.