Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查C中的可用内存?_C# - Fatal编程技术网

C# 如何检查C中的可用内存?

C# 如何检查C中的可用内存?,c#,C#,我正在实现一个LRU缓存。在将数据放入缓存时,我需要检查是否有足够的内存来存储新数据,如果没有,则调用缓存逐出例程。如何检查可用内存?不完全是您所要求的,但对于您的情况,我会去检查 我需要检查是否有足够的内存来存储新数据,如果没有,则调用缓存逐出例程 这是一个极坏的主意。你不应该这样做 正如陈雷蒙经常说的那样:当两件事试图做到这一点时,会发生什么?假设您在两个不同线程的相同地址空间中有两个组件。现在您遇到了最糟糕的竞争条件:两个组件都询问是否有足够的内存。假设其中一个有足够的内存,但不是两个都有

我正在实现一个LRU缓存。在将数据放入缓存时,我需要检查是否有足够的内存来存储新数据,如果没有,则调用缓存逐出例程。如何检查可用内存?

不完全是您所要求的,但对于您的情况,我会去检查

我需要检查是否有足够的内存来存储新数据,如果没有,则调用缓存逐出例程

这是一个极坏的主意。你不应该这样做

正如陈雷蒙经常说的那样:当两件事试图做到这一点时,会发生什么?假设您在两个不同线程的相同地址空间中有两个组件。现在您遇到了最糟糕的竞争条件:两个组件都询问是否有足够的内存。假设其中一个有足够的内存,但不是两个都有。是什么魔法力量让他们中的一个执行缓存驱逐,而不是另一个?没有这种力量。两者都将尝试分配内存,其中一个将失败

即使没有两样东西,基本的想法也是不好的。这里的想法是尽可能靠近悬崖边缘行走,但不要走得太近以至于从悬崖上摔下来。这是从悬崖上摔下来的秘方。你不应该在任何地方,哪怕是离悬崖边缘很近的地方。你应该看看这20亿字节的虚拟地址空间,然后想想哇,这真是太大了。我根本不可能把它用完。如果您确实认为您可能已经用完了,那么您需要将一些工作转移到另一个进程中,或者使用内存映射文件并管理您自己的虚拟内存

所以让我们后退一步。缓存是一种性能优化,其工作原理是以更少的时间换取更多的内存使用。您应该问自己的问题是,我的客户勉强接受的性能水平是多少?量化。然后首先问,没有缓存的性能是否已经可以接受?如果是这样的话,你就不需要烧掉记忆;你已经足够好了。如果还不够好,那么试着设计一个固定大小的缓存来提供足够好的性能。只有当你不能做到这一点时,你才应该使用更先进的技术

大型缓存的一种常见技术是让垃圾收集器负责缓存:使缓存成为弱引用的缓存。弱引用是不阻止垃圾收集但也不鼓励垃圾收集的引用;基本上,如果GC感觉内存不足,它将收集一些弱引用对象。您的缓存逻辑基本上是:缓存所有内容。搜索缓存时,询问弱引用是否已收集。如果回答是“是”,请从缓存中删除弱引用。如果答案是否定的,将其转换回强引用并使用该对象。这项技术是可行的,但也有它的缺点:即,您刚刚让CLR GC团队负责调整缓存。他们可能对什么是好的缓存策略有不同的看法