我有一个性能计数器记者类,它在多个成员中保存不同的列表。是否有一种简洁的方法告诉班级其消费的内存限制(作为防弹案例,列表将被大量数据推送),或者我应该去每个成员并将其更改为阻止列表? (这在某种程度上不那么动态)
答案 0 :(得分:1)
你问的是没有意义的。一个类怎么能限制它的内存消耗呢?
考虑一下:您有一个公共属性,它是一个数据列表。您将该属性的值设置为2GB数据集,但该类限制为100MB。班级如何决定丢弃哪些数据?抛弃的数据会发生什么变化?你的程序的其余部分如何处理它的一半数据消失的事实?
这些问题都没有得到明智的回答,因为每个程序都有不同的答案。出于这个原因,你必须自己实现这样的逻辑。
但是,更重要的是,您应该考虑这一点:如果我创建一个包含2GB数据的List<int>
,并将此列表分配给“记者类”的属性,则记者类的内存消耗量< em>不会改变。这是因为您的记者类具有List<int>
的属性,这意味着该属性存储在其他位置保存的List<int>
的内存地址堆。这个内存地址 - 一个指针到我们认为属性的“值” - 根据你的机器/应用程序的架构来修复,永远不会改变。当指针为null
时,它的大小与指针指向2GB列表时的大小相同。因此,从这个意义上说,你班级本身的记忆消耗不会像你想象的那么大。
您可以重新定义问题,说“在计算消耗时,包括我的属性指向的所有对象”,但这有其自身的问题。如果将List<int>
分配给两个不同对象的属性,每个对象都有自己的内存限制,会发生什么?
此外,如果您的报告类具有两个属性,可以容纳大数据,并且我为每个属性分配了大值,那么您如何决定扔掉什么?如果我对类有100MB的限制,并将200MB的数据分配给一个属性,将1GB的数据分配给另一个属性,我会截断哪些数据?如果我之后清除其中一个属性会发生什么 - 我现在有“备用”内存消耗,但数据无法挽回地丢失。
简而言之:这是一项非常复杂的要求。你必须创建自己的逻辑来实现它,并且你不太可能找到任何“标准”来处理它,因为没有两个实现是相同的。