这是事实:
Go语言具有垃圾回收器。
Java有垃圾回收
许多Java程序都有(微妙的或没有的)内存泄漏
作为具有内存泄漏的Java程序的示例(并非出于胆怯,这个问题可能会动摇您的信念),请参见此处有关一个名为Tomcat的小型Java程序,该程序甚至具有“查找泄漏”按钮:有没有办法以避免在Tomcat中取消部署内存泄漏?
所以我想知道:用Go编写的程序是否会表现出与某些用Java编写的程序一样的(细微或不细微的)内存泄漏?
这是事实:
Go语言具有垃圾回收器。
Java有垃圾回收
许多Java程序都有(微妙的或没有的)内存泄漏
作为具有内存泄漏的Java程序的示例(并非出于胆怯,这个问题可能会动摇您的信念),请参见此处有关一个名为Tomcat的小型Java程序,该程序甚至具有“查找泄漏”按钮:有没有办法以避免在Tomcat中取消部署内存泄漏?
所以我想知道:用Go编写的程序是否会表现出与某些用Java编写的程序一样的(细微或不细微的)内存泄漏?
memory leak
比您的定义更好”。
Answers:
您在这里混淆了不同类型的内存泄漏。
基于Java(或任何其他基于GC的语言)的基于内存的令人发指的显式内存管理不再存在。这些泄漏是由于完全失去对内存块的访问而没有将其标记为未使用引起的。
在计算机可以读取我们的思想之前,Java以及地球上其他所有语言仍然存在“内存泄漏”,并且这将在可预见的将来出现。这些泄漏是由代码/程序员保留对技术上不再需要的对象的引用引起的。这些从根本上讲是逻辑错误,使用当前技术无法用任何语言阻止。
java.util.logging.Level
包含一个私有静态ArrayList
变量,所有此类构造对象都包含在其中),这确实是正确的。放置在结构上,并且永远都不会删除它们),这使得Java编程时比使用不包含此类缺陷的其他语言更难避免使用它们
无论是否收集垃圾,您都可以编写一种程序,该程序大部分都使用Java,Go或任何其他语言进行内存泄漏。
垃圾回收确实减轻了程序员的负担,但是并不能完全防止泄漏。
您在这里混合了抽象级别:内存泄漏是由于库中的错误引起的(对象之间相互引用,尽管'a的链保持对b'的引用,以及在效率和效率之间实现垃圾收集器的折衷方案)您想花多少时间来发现这样的回路?如果您花费两倍的时间,您将能够检测到两倍长的回路。
因此,内存泄漏问题不是特定于编程语言的,没有理由认为GO本身应该比Java更好或更差。