在C#中分配内存实际上并没有分配内存

时间:2018-08-09 19:27:17

标签: c# arrays memory garbage-collection ram

当我声明一个新的字节数组时,内存使用不会增加。

byte[] test = new[1024*100];

只有在我遍历每个字节之后,它才真正开始占用内存。

我如何使它实际上不必提交内存就提交内存?

我将其用作带有try catch块的测试,以查看它是否将无法分配内存,从而告诉我我的应用程序超出了内存范围,因此不应尝试分配任何新对象。

编辑:由于我要分配的对象与垃圾回收器和堆栈一起使用,因此我不想使用malloc进行分配,因为它可能在那里成功,但是在尝试分配新的托管对象时会失败。 / p>

3 个答案:

答案 0 :(得分:2)

好吧,如果您真的想映射所有的内存,请在数组中重复并用零填充。无论如何,这都是线性时间。为此使用Array.Clear。 C#实际上并不是为实现这种内存优化而设计的。您应该关心的唯一资源是未损坏的资源。在C#中思考其余内存消耗的正确方法是完全不思考。老实说,我不知道C#如何在数组声明期间处理内存分配,这很重要,我没有使用高级抽象语言来关心这些东西。仅当您的应用程序遇到内存瓶颈并且需要优化时,它才有意义。

有一个stackalloc operator,它可能是您的首选,但它是不安全的操作员。还有GC.GetTotalMemory(),它可以显示(受管理对象)当前的内存使用情况,Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory可以为您提供计算机的总RAM(不要介意名称中的VB,这是一个.NET Framework方法,只需添加对Microsoft.VisualBasic.Devices的引用即可,因此,使用此方法可以实现您的目标:或多或少地知道是否有足够的内存来分配数组。

答案 1 :(得分:0)

如果您希望它分配所有字节,则可以使用Array.Clear,它将用0填充所有值

library(tidyverse)
library(jsonlite)

map_dfr(1:500, ~fromJSON(str_glue("https://hello.com/users/{.}/bets")))

这个简单的控制台应用程序可让您监视创建和填充明文时的内存使用情况

Array.Clear(test, 0, test.Length);

答案 2 :(得分:0)

制作了一个函数,该函数将尝试实际分配我指定的内存(并在可能的情况下抛出异常,而不是撒谎),并在成功的情况下立即被垃圾收集器收集。

bool IsMemoryAvailable(int amount)
{
    int size = (int)Math.Sqrt(amount) / 2;

    try
    {
        using (Bitmap bmpTest = new Bitmap(size, size))
        {

        }

        GC.Collect();

        return true;
    }
    catch(Exception x)
    {
        return false;
    }
}