一尘不染

C#和Java中的垃圾回收之间的根本区别是什么?

java

我最近从“高级”开发人员/同事那里得到了一些关于C#垃圾收集器的非常错误的建议,例如…

  • “在C#中,您需要在所有地方使用析构函数,因为不能依赖垃圾收集器。”

  • “不能将C#垃圾收集器视为Java垃圾收集器”。

就我所知,这听起来非常可疑,据我所知,C#和Java垃圾收集器之间的区别如下…

  • C#是分代垃圾收集器,Java是1.6中的并发标记清除,而G1是具有Java 7的新的默认(分代)垃圾收集器,自1.6.21起已成为可选项。我所知道的
  • C#作为一种语言可以手动处置实现的对象IDisposable。Java必须始终使用垃圾回收,尽管诸如SWT之类的某些框架要求您手动调用方法以释放底层本机代码中的内存。

我意识到Java和C#只是语言,而垃圾收集器是运行时的组成部分,但是,在这种情况下,我专门讲的是Sun / Oracle JVM和Microsoft
.NET Runtime。

有人反馈吗?


阅读 384

收藏
2020-12-03

共1个答案

一尘不染

从广义上讲,您得到的建议很多。

C#和Java都有GC,它们试图优化许多小对象的快速恢复。它们旨在解决相同的问题,它们以略有不同的方式进行处理,但是作为用户,您使用它们的方法上的技术差异很小,甚至对于大多数用户而言都是不存在的。

IDisposable与GC本身无关。它的命名方法的标准方式,否则将被调用closedestroydispose等,并经常被称为是在Java中。对于Java
7,有人建议添加与using关键字非常相似的内容,以调用相似的close方法。

C#中的“析构函数”指的是终结器-故意这样做是为了混淆C ++程序员。:) CLR规范本身将它们称为终结器,就像JVM一样。

Java和C#/
CLR有很多不同的方式(用户值类型,属性,泛型和整个相关功能家族,称为Linq),但是GC是您可以在需要之前开发大量软件的领域之一担心它们之间的差异。

2020-12-03