gpt4 book ai didi

c# - 大对象堆碎片,数组问题

转载 作者:太空狗 更新时间:2023-10-29 19:42:59 26 4
gpt4 key购买 nike

我正在用 C# 编写一个分析应用程序,它必须处理大量内存。我使用 ANTS Memory Profiler 7.4 来优化我的内存管理。这样做时,我意识到我使用的所有 double[,] 数组(我需要它们)都放在 LOH 上,尽管这些数组中最大的大约为 24.000 字节。据我所知,对象不应放在 85.000 字节之前。现在的问题是,由于我有大约几千个这些 double[,] 数组的实例,所以我有很多内存碎片(我总内存使用量的大约 25% 是我无法使用的空闲内存)。一些存储在 LOH 上的数组甚至只有 1.036 字节大小。问题是有时我必须执行更大的分析,然后由于 LOH 碎片导致大量内存丢失,我最终会遇到内存不足异常。

有谁知道为什么会发生这种情况,尽管根据定义它不应该是一个大对象?

Memroy snapshot of my application using ANTS Memory Profiler

small double arrays are also affected by this (only 70 elements in the array)

最佳答案

在 LOH 上放置 double 组的阈值大小远低于其他类型。这样做的原因是 LOH 上的项目始终是 64 位对齐的,并且 double 从 64 位对齐中受益匪浅。

请注意,这只会影响以 32 位运行的程序。以 64 位运行的程序具有始终在 64 位边界上对齐的对象,因此 LOH 启发式算法不用于 64 位程序。

阈值大小为 1000 倍。

另见 https://connect.microsoft.com/VisualStudio/feedback/details/266330/

关于c# - 大对象堆碎片,数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11791038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com