c# - 垃圾收集会影响堆栈吗?

标签 c# java .net

我刚开始使用 .NET Framework,使用 C# 作为我的语言。我对 Java 中的 GC 概念有所了解,今天在 .NET 中重温了相同的概念。

在 C# 中,值类型被放入堆栈(与 Java 的情况相同,其中局部变量被放入堆栈)。但在 C# 中,甚至 struct 也包含在值类型中。因此,即使是 struct 也被放置在堆栈上。在最坏的情况下,有很多方法调用,堆栈中填充了大量方法,每个方法都有很多局部值类型,许多 struct 本身也有很多局部值类型,垃圾收集器会影响堆栈吗?根据我的研究(以及我所学的部分内容),我知道它不会这样做。主要是因为操作堆栈内容会涉及很多开销,此外,GC 仅查询堆栈以查找引用 - 仅此而已。

只是添加与同一主题相关的另一个问题:强制调用 GC(如 Java 中的 System.gc(),不确定 C# 等效项),并不能确保然后调用 GC 例程。那么我应该在哪里进行这样的调用——我希望我需要 GC 运行的地方,或者任何随机的地方,因为不能保证我的调用会立即触发 GC?还是我应该将这些东西留给运行时环境而不用管它?

注意:我添加了 Java 标记,因为我试图从那里链接概念。我知道 GC 在两个独立的运行时环境中的内部功能肯定会有所不同,但我想基本概念是相同的。

最佳答案

垃圾收集不会影响 java 堆栈上的对象。

GC 只影响 jvm 堆中的对象。 Java GC 过程是多层的,可能非常复杂,值得一读。查看以下网站:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html以很好地掌握它的运作方式。

就强制系统的 GC 而言,这是一个坏主意。当 GC 需要运行时,jvm 会更好地了解您。如果您尝试分配一个大对象,jvm 将确保为您分配空间,而无需您告诉它运行 GC。

编辑 我的错,你更关心 C# 而不是 java。内存管理的相同原则适用,堆栈不受影响,不要显式运行 GC 等。C# 旨在以与 java 类似的方式运行。 http://msdn.microsoft.com/en-us/library/ms973837.aspx

关于c# - 垃圾收集会影响堆栈吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671583/

相关文章:

c# - 如何调试异步代码?

c# - Ubuntu - 运行 dotnet new 控制台时出现段错误错误

java - 为什么我们为内部类创建对象时会调用getClass()?

java - 有什么方法可以通过 JNI 获取指向 Java 数组的直接指针吗?

c# - 实现自定义 CacheDependency 以使 ASP.Net 缓存项无效

c# - 制作 MS Excel 用户定义函数

c# - C# 中的 WeakReference - 操作实例是如何丢失的?

java - 使用 AWT 按钮浏览并显示 'textfield' 中的每条数据库记录

c# - DataGridView Winforms 填充 ComboBoxCell

c# - 如何将属性附加到自定义事件?