c# - 缓冲区是从共享堆中为大小为 64 KB 的进程分配的?

标签 c# winapi heap-memory pinvoke

有没有人愿意为那些对非托管代码和内存管理的复杂性一无所知的人翻译这句话?

The storage for this buffer is allocated from a shared heap for the process that is 64 KB in size. The maximum size of the buffer will depend on heap usage.

它出现在几十个 MSDN 页面上,例如WriteConsole ,但我找不到任何 API 来计算这种数组在爆炸前允许的最大大小,根据经验我可以告诉它它在 61 到 62.5 KB 之间(通过调用 64、63、62 等直到它停止设置 DllImportSetLastError)。是否有类似 GetTotalHeapSize 的东西(如果它不是独立于 Windows 版本、平台架构、默认值等的 const 64KB)和类似 GetCurrentHeapInUse 的东西可用?如何获得我可以传递给该方法和其他 P/Invoked 方法的最大字节数?

最佳答案

这不是堆的工作方式。他们不会跟踪您可以进行的最大分配。这是不可预测的,因为堆可能会碎片化。空闲 block 可以与分配的 block 交织。例如,释放一个小的分配可能会突然使可用空间翻倍。非托管堆没有托管堆的优势,它们不能被压缩。尽管.NET Large Object Heap 也有这个问题。没有衡量最大可用空间的函数,不可能做到线程安全。

你只能尝试分配和处理你做不到的后果。

关于c# - 缓冲区是从共享堆中为大小为 64 KB 的进程分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16025990/

相关文章:

c# - 在使用 C# 的 Visual Studio 2008 中,如何设置属性监视?

c++ - 在WINAPI中动态创建按钮

c - 无法使用for循环创建多个线程

haskell - 过多的垃圾收集(和内存使用?)

c# - wpf TabControl,可以将每个选项卡组织在不同的类中吗?

c# - 关于线程池的问题

c# - ASP.NET 站点在无法将 DBNull.Value 转换为类型 'System.Guid' 时崩溃

c# - 如何向窗口标题栏添加一个额外的按钮,以便它按标准工作?

java - "main"java.lang.OutOfMemoryError : Java heap space Error in Stanford Custom Entity Recognition Model training

java - 如何在不增加 eclipse 上堆大小的情况下避免内存不足异常