大型数组和LOH片段。公认的做法是什么?我在这里还有另一个活跃的问题,关于一些可能涉及LOH片段和其他未知因素的绝望内存问题。我现在的问题是,公认的做事方式是什么?如果我的应用程序需要在VisualC#中完成,并且需要处理将大型数组的大小调整为int[4000000],我怎么能不注意到垃圾收集器拒绝处理LOH?似乎我被迫将任何大型阵列全球化并且从不在它们周围使用“新”一词。因此,我只剩下带有“maxindex”变量的不合适的全局数组,而不是函数传递的大小整齐的数组。我一直被告知这是不好的做法。有什么选择?System.GC.CollectLOH("Seriously")是否具有某种功能?是否可以将垃圾收集外包给System.GC以外的其他东西?无论如何,处理大(>85Kb)变量的普遍接受规则是什么?首先,垃圾收集器确实收集了LOH,所以不要立即被它有多早吓到。在收集Generation2时收集LOH。不同的是LOH不会被压缩,这意味着如果你有一个寿命很长的对象那么你将有效地将LOH分成两部分-它前面的区域和区域在那个对象之后。如果这种情况持续发生,那么您最终可能会遇到长寿命对象之间没有足够空间进行后续分配的情况,.NET必须分配越来越多的内存来放置大对象,即LOH变得碎片化。现在,话虽如此,如果LOH的末端区域完全没有生物,那么LOH的大小就会缩小,所以唯一的问题是如果你把物体放在那里很长时间(例如在应用程序期间).避免LOH分裂的策略是:编辑:双阵列的LOH阈值似乎是8k。这是一个老问题,但我认为使用.NET中引入的更改来更新答案没有什么坏处。现在可以对大对象堆进行碎片整理。显然,首要任务应该是确保做出最佳设计选择,但现在有这个选项真是太好了。https://msdn.microsoft.com/en-us/library/xe0c2357(v=vs.110).aspx“从.NETFramework4.5.1开始,您可以在调用Collect方法Compact之前设置GCSettings.LargeObjectHeapCompactionMode属性GCLargeObjectHeapCompactionMode.CompactOnce的大对象堆(LOH),如以下示例所示。GCSettings可以在System.Runtime命名空间中找到GCLargeObjectHeapCompactionMode.CompactOnce;GC.收集();数组被分成更小的数组,这样它们就不会到达GC需要放入LOH的内存。您可以将数组分成10,000个更小的数组,然后构建一个对象,该对象根据您传递给它的索引器知道要查找哪个数组。现在我还没有看到代码,但我也会质疑为什么你需要一个大数组。我可能会考虑重构代码,这样所有这些信息都不需要立即存储在内存中。你误会了。你不需要有4000000的数组大小,你绝对不需要调用垃圾收集器。这允许您仅通过一次重定向访问基本上所有元素。而且,由于单个数组较小,碎片化不是问题……如果是……然后重用该页面。不要将它们扔掉进行处理,而是将它们放在静态“PageList”上并先从那里拉出。所有这些都可以在您的课堂上透明地完成。真正的好处是这个List在内存使用方面是非常动态的。您可能想要调整holder数组(重定向器)的大小。即使不是,每页也只有512kb左右的数据。辅助数组基本上是每个字节64k-一个类是8字节(每页512kb,每32位256kb),或每个结构字节64kb。从技术上讲:将int[]转换为int[][]以确定32位还是64位更好,具体取决于您的需要;)两者各有利弊。任何语言都不可能处理大型数组-如果你愿意,那么......基本上......在程序启动时分配,永远不会重新创建。只有解决办法关于问题是怎么产生的,我在上面的回答中有详细说明。LOH的碎片不仅取决于长期存在的对象,而且如果您有多个线程并且每个线程都在LOH中创建一个大列表,那么您可能会遇到第一个线程需要增加其列表但下一个连续位的情况的内存已经被第二个线程的列表占用,因此运行时将为第一个线程的列表分配新内存——留下一个相当大的空洞。这是目前发生在我的一个继承项目中,所以尽管LOH大约是4.5MB,但在运行时总共有117MB可用,但最大的可用内存段是28MB。在没有多线程的情况下,另一种可能发生的情况是,如果在某种循环中添加了多个列表,并且每个列表都扩展到它最初分配的内存之外,那么当它们超过分配的内存时,每个列表都会在空间上超过另一个。一个有用的链接是:https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/仍在为此寻找解决方案,一个选项可能使用工作时池中的某种池对象和请求。如果您正在处理大型数组,另一种选择是开发一个自定义集合,例如一组集合,这样您就不会只有一个巨大的列表,而是将它分解成更小的列表,每个列表都避免使用LOH.以上就是C#学习教程:大数组和LOH片段。公认的做法是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
