Go是否受到与Java相同的微妙内存泄漏的影响?

Syn*_*r0r 75 java memory-leaks go

以下是事实:

  • 语言Go有一个垃圾收集器.

  • Java有一个垃圾收集

  • 很多Java程序都有(细微的或没有)内存泄漏

作为一个有内存泄漏的Java程序的例子(不是为了胆小的人,这个问题可能会动摇你的信念),请看这里有一个叫做Tomcat的小程序,它甚至有一个"查找泄漏"按钮:有没有办法为了避免Tomcat中的部署内存泄漏?

所以我想知道:用Go编写的程序是否会出现与Java编写的某些程序相同的(细微的或不存在的)内存泄漏?

小智 40

你在这里混淆了不同类型的内存泄漏.

令人发指的,基于显式内存管理的内存泄漏在Java(或任何其他基于GC的语言)中消失了.这些泄漏是由完全失去对内存块的访问而不将其标记为未使用引起的.

Java中存在的"内存泄漏"以及地球上所有其他语言,直到计算机能够读懂我们的思想仍然存在,并且将在可预见的未来.这些泄漏是由代码/程序员保持对技术上不再需要的对象的引用引起的.这些基本上是逻辑错误,并且在使用当前技术的任何语言中都无法阻止.

  • 内存泄漏只是在您忘记释放内存时.在Java中,当您忘记将引用设置为null时,就会发生这种情况.在C++中,如果您忘记免费通话,就会发生这种情况.两者都是有效的内存泄漏案例.而基本问题是相同的,你的程序消耗越来越多的内存,直到它最终崩溃与OutOfMemory错误. (20认同)
  • 我认为OP正在询问有关内存泄漏的实际无法访问的对象,如链接问题的已接受答案.由线程加载类引起的内存泄漏.-1 (6认同)

Poi*_*ter 19

Go程序很可能会出现内存泄漏.Go的当前实现有一个简单的标记和清除垃圾收集器.这仅作为临时解决方案,并非作为长期垃圾收集器.有关详细信息,请参阅此页面.看看标题下面Go Garbage Collector.如果您愿意,该页面甚至还有一个指向当前版本代码的链接.


jzd*_*jzd 8

是否收集垃圾,您可以编写一个程序,其中包含Java,Go或大多数其他语言的内存泄漏.

垃圾收集确实减轻了程序员的负担,但它并不能完全防止泄漏.

  • 对不起,不清楚.你说"很多Java程序都有(微妙或不存在)内存泄漏". (4认同)
  • 我知道我知道.我正在特别谈论Java中存在的那种微妙的内存泄漏,即使是艰难的Java,在它开始时,作为*语言推销,由于GC*,内存泄漏不存在. (3认同)

DJC*_*rth 8

"内存泄漏"是指程序员认为将释放的一块内存未被释放.这可能发生在任何语言,垃圾收集与否.GC语言的常见原因是保留对内存的额外引用.

"语言不会导致内存泄漏,程序员会导致内存泄漏".


flo*_*rin 3

您在这里混合了抽象级别:内存泄漏是由于库中的错误造成的(其中对象相互引用,尽管“a 持有对 b”的引用,以及垃圾收集器实现中效率和效率之间的权衡)准确性。您想花多少时间来找出此类循环?如果您花费两倍的时间,您将能够以两倍的时间检测循环。

因此,内存泄漏问题不是特定于编程语言的,GO 本身没有理由比 Java 更好或更差。

  • 循环引用链不会阻止 Java 中的垃圾收集。 (16认同)