C# 和 Java 中的垃圾收集

Posted

技术标签:

【中文标题】C# 和 Java 中的垃圾收集【英文标题】:Garbage collection in C# and Java 【发布时间】:2014-02-23 06:42:05 【问题描述】:

我知道垃圾收集器在找不到任何指向对象的指针时会收集分配的内存。 我想知道我是否在循环中创建和初始化一些本地对象,这些对象是由 Java 垃圾收集器收集的吗? C# 呢?

如果我在本地函数中创建和初始化一些对象,它们会发生什么?本地函数运行结束时会收集吗?

我想知道,局部对象和局部变量一模一样吗?

谢谢。

【问题讨论】:

Garbage Collection in .NET 【参考方案1】:

通常在函数中为非对象变量分配内存在stack 中,当函数完成执行时,stack 被清除并释放内存。

对于对象,内存分配在heap 中(你会记得C 中的malloc()free())。但是在 JavaC# 中,free() 函数是垃圾收集器为您所做的,而不是您担心它。

因此,即使在函数中,对象也是局部变量,但不存储在 stack 中,而是存储在 heap 中。所以他们和int i不一样。但是当函数完成时,那些对象就超出了范围。因此,您将无法再访问它们,但在 garbage collector 运行并清除它们之前不会释放它们的内存。

但是garbage collector 是如何运行的,它何时运行都基于不同的算法。对于 Java 的不同实现,它们可能并不相同(例如,sun java 的算法可能与另一个 Java 实现不同)

【讨论】:

非常感谢。所以我可能会因为本地对象而内存不足,因为垃圾收集器的执行时间不同。我知道手动终止对象并释放内存不是很好,所以你对本地对象有什么建议,因为我不喜欢我的程序内存不足。 别担心。这就是垃圾收集器可用的原因,它会负责删除未使用的对象,并且比我们做得更好:) 但是我感觉通过创建许多本地对象,程序的执行不会在内存使用上得到优化。我说的对吗? 不,这些语言发展良好。 gc 已经过很好的研究和实施,因此您可以依赖它们。就像从汇编语言转向C语言一样,语言越隐藏我们就越不相信! 是的,很难相信他们;)谢谢。

以上是关于C# 和 Java 中的垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的垃圾收集器

聊聊JAVA虚拟机中的垃圾收集器

67.Java垃圾收集机制对象引用垃圾对象的判定垃圾收集算法标记—清除算法标记—整理算法分代收集垃圾收集器性能调优

Java 主要和次要垃圾收集

标记为垃圾收集vs符合java中的垃圾收集条件

Java垃圾收集机制