C# 锁定/使用/分配内存

C# 锁定/使用/分配内存,c#,memory,memory-management,C#,Memory,Memory Management,在C语言中是否有锁定或分配内存的选项 情景1: 在我的虚拟机中,有16GB的RAM,为了进行测试,我需要使用8GB的RAM,这样8GB对于操作系统和rest应用程序将保持“免费” 情景2: 同样的虚拟机有16GB内存,现在我需要使用14GB内存 现在,我创建了一个内存泄漏函数,但这并不好,因为它占用了虚拟机的所有内存 List memoryUsage=新列表; 虽然是真的 { 尝试 { memoryUsage.Addnew字节[1024]; } 捕获OutOfMemoryException {

在C语言中是否有锁定或分配内存的选项

情景1: 在我的虚拟机中,有16GB的RAM,为了进行测试,我需要使用8GB的RAM,这样8GB对于操作系统和rest应用程序将保持“免费”

情景2: 同样的虚拟机有16GB内存,现在我需要使用14GB内存

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

List memoryUsage=新列表; 虽然是真的 { 尝试 { memoryUsage.Addnew字节[1024]; } 捕获OutOfMemoryException { 投 } } 分配或锁定用户me将输入文件的RAM,例如
我想分配/锁定8GB RAM和程序分配/锁定8GB RAM和8GB RAM将保持“空闲”

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

让我们看一下您的第一个场景—您希望分配8GB RAM的场景。您的代码正好可以做到这一点。但是,您的操作系统可以启动并将一些表示RAM中已分配数据的页面移动到磁盘。内存管理器之所以会这样做,有几个原因-看看下面的一些页面可以从进程工作集中删除。。。段落因此,您将拥有原来打算使用的更少的RAM

据我所知,您需要的是一个由流程占用的恒定工作集,我不确定C—即使在不安全的上下文中—是否允许您这样做。您可以尝试调用在较低级别工作的Win32函数,可能如前所述使用P/Invoke,但正如我所说,我不确定它是否能工作

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

你还没有真正提到你用来构建这个平台的目标平台。一个为x86或AnyCPU+32位构建的进程将更早地抛出内存不足错误(仅分配了大约3 GB),因为这就是原因


如果你真的不需要自己编写在C中进行分配的代码,也许你只需要调用类似的东西,然后设置最小工作集。

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