首页 文章

在C#中分配内存并不是实际分配内存

提问于
浏览
0

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

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

它只是在我遍历每个字节之后才真正开始使用ram .

如何让它实际上提交内存而不必先使用它?

我使用它作为测试使用try catch块来查看它是否将无法分配内存,从而告诉我我的应用程序不在ram中,它不应该尝试分配任何新对象 .

编辑:因为我要分配的对象与垃圾收集器和堆栈一起使用,我不想使用malloc分配,因为它可能在那里成功,但在尝试分配新的托管对象时失败 .

3 回答

  • 0

    好吧,如果你真的想要映射所有内存,那么重复数组并用零填充它 . 无论如何,这是线性时间 . 使用 Array.Clear . C#真的不是为了这样的内存优化而做的 . 您应该关注的唯一资源是没有损坏的资源 . 在C#中考虑其余内存消耗的正确方法并没有考虑到它 . 老实说我不知道C#在数组声明中如何处理内存分配,并且's kinda the point, I'm没有使用高级抽象语言来关心这些东西 . 只有当你有一个遇到内存瓶颈的工作应用程序而你需要进行优化时才有意义 .

    有一个stackalloc operator,您可以弯曲使用,但它是一个不安全的操作员 . 还有GC.GetTotalMemory(),它可以显示当前的内存使用情况(托管对象),Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory可以显示机器的总RAM(请't mind the VB in the name, it' sa .NET Framework方法,只需添加对_1690811的引用),所以使用如果有足够的内存供您分配阵列,那么您可以实现更多或更少知道的目标 .

  • 2

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

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

    这个简单的控制台应用程序允许您监视内存使用情况,因为它已创建并使用clear填充

    class Program
    {
        static void Main(string[] args)
        {
            //Memory usage 7.1 MB
            Console.WriteLine("Hit enter to allocate");
            Console.ReadKey();
            byte[] data = new byte[1024*1024]; //Memory still 7.1 MB
            Console.WriteLine("Hit Enter to Fill with zeros!");
            Console.ReadKey();
            Array.Clear(data, 0, data.Length); //Memory now 8.1 MB
            Console.WriteLine("1MB filled, hit enter to exit");
            Console.ReadKey();
        }
    }
    
  • 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;
        }
    }
    

相关问题