C#中的每个线程内存管理
-
04-10-2019 - |
题
继续讨论 了解VS2010 C#并行分析结果 但更多的是:
我有许多并行工作的线程(使用/每个),这些线程使用许多记忆分配用于小类。
这会在全局内存分配线程上创建争论。
是否有一种方法可以指示.NET对每个线程进行预处理一个内存池并进行此池中的所有分配?
目前,我的解决方案是我自己的内存池的实现(T型对象的全球分配阵列,它们在线程之间回收),这对:很有帮助,但由于:
- 我无法指示.net从特定的内存切片中分配。
- 我仍然需要打电话 新的 很多次分配池的内存。
谢谢,
哈盖
解决方案
我搜索了两天,试图找到解决您遇到的相同问题的答案。答案是您需要将垃圾收集模式设置为服务器模式。默认情况下,将垃圾收集模式设置为工作站模式。将垃圾收集设置为服务器模式,导致托管堆分为单独管理的部分,即每次CPU。为此,您需要将配置设置添加到app.config文件中。
<runtime>
<gcServer enabled="true"/>
</runtime>
我的12核Opteron 6172上的速度差异很大!
其他提示
垃圾收集器不会分配内存。
听起来更像是您要分配许多小临时对象和一些长寿命的对象,而垃圾收集器正在花费大量时间来收集临时对象,因此您的应用程序不必从该应用程序请求更多内存。操作系统。从 .NET框架4高级开发 - 垃圾收集:
只要在托管堆中提供地址空间,运行时就会继续为新对象分配空间。但是,记忆不是无限的。最终,垃圾收集器必须执行收集以释放一些内存。
解决方案: 不要分配很多小临时对象。 页面上 垃圾收集和性能 也可能会有所帮助。
您可以预先分配一堆对象,并将它们组成用于单独线程的组。但是,您可能不会从中获得更好的表现。
垃圾收集器专门设计用于有效处理小型短寿命。如果您将物体放在游泳池中,它们是长寿的,并且将在垃圾收藏中生存,这又意味着它们将被复制到第二代堆中。这种复制将比仅分配新对象更昂贵。
不隶属于 StackOverflow