【问题标题】:Lock / Use / Allocate memory锁定/使用/分配内存
【发布时间】:2019-12-07 04:30:29
【问题描述】:

在 C# 中是否有任何锁定或分配内存的选项?

场景 1: 在我的虚拟机中,有 16GB RAM,为了进行测试,我需要使用 8GB RAM,因此 8GB 对于操作系统和其他应用程序将保持“空闲”

场景 2: 相同的虚拟机有 16GB RAM,现在我需要使用 14GB RAM。

目前,我创建了一个内存泄漏函数,但这并不好,因为它会占用我虚拟机的所有内存。

List<byte[]> memoryUsage = new List<byte[]>();
while (true)
{
    try
    {
        memoryUsage.Add(new byte[1024]);
    }
    catch (OutOfMemoryException)
    {
        throw;
    }
}

分配或锁定用户(我)将输入到文件的 RAM,例如 我想分配/锁定 8GB RAM,程序分配/锁定 8GB RAM,8GB RAM 将保持“空闲”状态

【问题讨论】:

  • “它从我的虚拟机中占用了所有内存”——不过,显然只是因为你没有做任何事情来限制它分配的内存量。为什么不分配更少的内存? C# 可以分配内存,就像您在上面所做的那样。使用不安全的代码,您可以锁定(或“锁定”)它。使用 p/invoke,您可以调用系统 API 来独立于基于 CLR 的代码来管理内存。但你的问题不清楚。您希望能够使用“已分配”/“锁定”的内存吗?或者只是消耗它,所以它不能用于其他东西?这里的实际目标是什么?
  • 只消耗那块内存,这样它就不能被其他东西使用了。

标签: c# memory memory-management


【解决方案1】:

如果您在 Windows 机器上运行它,您需要牢记虚拟内存的概念。您可以使用 C# 将内存分配或泄漏到您心中的内容,但是如果底层操作系统认为将您的进程正在使用的内存分页到分页文件是安全的(假设至少定义了一个这样的文件),它会做所以。

让我们以您的第一个场景为例 - 您想要分配 8 GB RAM 的场景。您的代码可以做到这一点。但是,您的操作系统可以启动并将代表您在 RAM 中分配的数据的一些页面移动到磁盘。内存管理器会这样做有几个原因 - 查看一些 here(在“Pages can be removed from a process working set...”段落下)。因此,您将得到原本打算使用较少的 RAM。

据我了解,您的进程占用了一个恒定的工作集,我不确定 C#(即使在不安全的上下文中)是否允许您这样做。您可以尝试调用在低级别工作的 Win32 函数,可能使用 P/Invoke,如 here 所述,但就像我说的,我不确定它是否会工作。

您还必须留意引用您分配的数据的变量。如果 GC(垃圾收集器)决定从某个点开始不再需要您分配的数据(比如说因为您的剩余代码不再引用它),它会很高兴地回收它,再次给您留下更少的分配内存本来想要的。

您还没有真正提及您用于构建此的目标平台。为 x86(或 AnyCPU + Prefer 32 位)构建的进程会更早地抛出内存不足错误 - 在仅分配大约 3 GB 之后,因为这就是 things work in Wow64 的方式。

如果您真的不必在 C# 中编写自己进行分配的代码,也许您可​​以只调用 Testlimit 之类的东西(并尝试设置最小工作集)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2017-11-02
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2012-02-08
    相关资源
    最近更新 更多