我读了一篇让我对内存分配感到困惑的文章,其中说:
单例对象存储在堆中,静态类存储在堆栈中.。
链接是:http://www.dotnetjalps.com/2013/06/Static-vs-Singleton-in-Csharp-Difference-between-Singleton-and-Static.html
但是在一些堆栈溢出问题中,例如
它被描述成
静态变量存储在堆中,无论它们是作为引用类型声明还是作为值类型声明。不管创建了多少个实例,总共只有一个插槽。
因此,我对静态类的堆栈或堆存储感到困惑。如何为静态类分配内存,为什么?如何为单例类分配内存?
发布于 2015-11-06 08:27:50
类将不会占用内存,但对象会使用。在我看来,“存储在堆栈中的静态类”的说法听起来很荒谬。
类没有存储在内存中。加载类时,可以将它们的元数据加载到内存中并进行缓存。除此之外,类不存储在内存中。
扪心自问,如果静态类存储在堆栈中,如何能够在所有线程中访问它?
静态变量
静态变量是MethodTable数据结构的重要组成部分。它们是在方法表槽数组之后作为MethodTable的一部分分配的。所有原始静态类型都是内联的,而静态值对象(如structs和引用类型)则通过句柄表中创建的OBJECTREF引用。MethodTable中的OBJECTREF是指AppDomain句柄表中的OBJECTREF,是指堆创建的对象实例。创建之后,句柄表中的OBJECTREF将使堆上的对象实例保持活动状态,直到卸载AppDomain。
参考这篇文章想了解更多信息
请停止阅读那篇博客文章或任何作者的博客文章。这是完全荒谬的。
发布于 2016-05-26 00:55:13
斯里拉姆·萨基维尔解释得很好。基本上,堆内存分为两个主要部分。对象堆内存和加载程序堆内存。根据我的理解,所有非静态引用类型都存储在对象堆中,所有静态对象(可能是引用类型或值类型)都存储在加载程序堆中。Gc从不在加载程序堆上工作,这就是为什么它们只初始化一次并通过应用程序保持在内存中的原因。
发布于 2017-08-30 10:25:30
静态变量进入Heap.It内部的特殊原因称为高频堆,所有静态变量进入内存中的高频堆。高频堆中的对象不是GC收集的垃圾,因此在应用程序的整个生命周期中都可以使用静态变量。
我们需要显式地去分配它,然后我们必须将它设置为空,以便GC能够清除它所分配的内存。
https://stackoverflow.com/questions/33562199
复制相似问题