微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

耗尽ValueType堆栈空间

如何解决耗尽ValueType堆栈空间

| 我的理解是,.Net中的每个新线程都会分配1MB的堆栈空间。我的进一步理解是,值类型存储在堆栈上,而不是堆上。 所以我的问题是这种行为是否意味着任何ValueType变量声明都限于1MB的存储空间?在当前作用域中声明的ValueTypes越多,则调用栈可以越有效,这在某个时候是否意味着声明(出于参数考虑)〜260,000 int将占用您的所有堆栈空间?     

解决方法

        这类问题最有成果的答案通常是去测试。其他人告诉您,您不必为此担心,它们是正确的。所有链接的文章都很棒,值得一读。在大多数实际情况下,您将不需要1MB的局部变量。 但是,如果您想知道天气,实际上可以拥有1MB的局部变量值吗? 正如其他人指出的那样,这是实现细节,结果可能会因平台,编译器版本,供应商等而异。 让我们自己测试一下,看看有没有可能。我正在使用VS2010和C#4.0编译器的x64计算机上。 这是我的代码:
using System;

namespace SO6301703
{
    struct s64b
    {
        public long f1;
        public long f2;
        public long f3;
        public long f4;
        public long f5;
        public long f6;
        public long f7;
        public long f8;
    }

    struct s256b
    {
        public s64b f1;
        public s64b f2;
        public s64b f3;
        public s64b f4;
    }

    struct s1kb
    {
        public s256b f1;
        public s256b f2;
        public s256b f3;
        public s256b f4;
    }

    struct s8kb
    {
        public s1kb f1;
        public s1kb f2;
        public s1kb f3;
        public s1kb f4;
        public s1kb f5;
        public s1kb f6;
        public s1kb f7;
        public s1kb f8;
    }

    struct s64kb
    {
        public s8kb f1;
        public s8kb f2;
        public s8kb f3;
        public s8kb f4;
        public s8kb f5;
        public s8kb f6;
        public s8kb f7;
        public s8kb f8;

    }

    struct s512kb
    {
        public s64kb f1;
        public s64kb f2;
        public s64kb f3;
        public s64kb f4;
        public s64kb f5;
        public s64kb f6;
        public s64kb f7;
        public s64kb f8;

    }

    struct s1Mb
    {
        public s512kb f1;
        public s512kb f2;

    }

    class Program
    {
        static void Main(string[] args)
        {
            unsafe { Console.WriteLine(sizeof(s1Mb)); }
            s1Mb test;
        }
    }
}
当我编译并运行此代码时,我得到了堆栈溢出异常。这意味着至少在某些情况下确实受到堆栈空间的限制。这确实意味着您拥有的局部变量越多,剩下的用于方法调用,递归等的堆栈就越少。 再一次:这些考虑几乎是不实际的。如果您要分配价值1MB的局部变量,则很可能您做错了什么。但是如果您仍然想知道...现在您知道了。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?