我刚开始使用 C# 作为我的语言的 .NET Framework。我有点理解 Java 中 GC 的概念,并且今天在 .NET 中重新审视了相同的概念。
在 C# 中,值类型被放入堆栈(与 Java 的情况相同,局部变量被放入堆栈)。但在 C# 中,甚至struct
包含在值类型中。因此,偶数struct
s 被放入堆栈。在最坏的情况下,有许多方法调用,堆栈中大量填充了许多方法,每个方法都有许多本地值类型,并且许多struct
本身具有许多本地值类型的 s,垃圾收集器是否会影响堆?根据我的研究(以及我所学到的部分内容),我知道它不会这样做。主要是因为操作堆栈内容会涉及大量开销,此外,GC 仅咨询堆栈以查找引用 - 仅此而已。
只是添加与同一主题相关的另一个问题:强制调用 GC(如System.gc()
在 Java 中,不确定 C# 等效项),并不能确保当时和那里调用 GC 例程。那么我应该在哪里进行这样的调用 - 我希望我需要 GC 运行的地方,或者任何随机的地方,因为不能保证我的调用会立即触发 GC?或者我应该把这些东西留给运行时环境而不去管它吗?
注意:我添加了 Java 标记,因为我试图从那里链接概念。我知道 GC 在两个单独的运行时环境中的内部功能肯定会有所不同,但我想基本概念是相同的。