Go是否受到与Java相同的微妙的内存泄漏?
这里是事实:
-
语言Go有一个垃圾收集器。
-
Java有一个垃圾收集
-
很多Java程序有(微妙的或不)内存泄漏
作为一个Java程序有内存泄漏的例子(不是心存疑虑,这个问题可能会动摇你的信念),在这里看到一个叫做Tomcat的Java程序,它甚至有一个“find leaks”button: 有没有办法避免在Tomcat中取消部署内存泄漏?
所以我想知道:用Go编写的程序是否会展现出与Java编写的一些程序一样的(微妙的或不是)内存泄漏?
你在这里混淆了不同types的内存泄漏。
在Java(或任何其他基于GC的语言)中,基于内存,显式内存pipe理的内存泄漏已经消失。 这些泄漏是由于完全失去对大量内存的访问而没有将其标记为未使用而造成的。
Java中的“内存泄漏”仍然存在,直到计算机可以读取我们的思维的所有其他语言仍然存在,并将在可预见的将来。 这些泄漏是由代码/程序员保持对技术上不再需要的对象的引用引起的。 这些根本上是逻辑错误,不能用任何使用现有技术的语言来防止。
Go程序很可能会出现内存泄漏。 Go的当前实现有一个简单的标记和清理垃圾收集器。 这只是作为一个临时的解决scheme,而不是作为长期的垃圾收集器。 请参阅此页面了解更多信息。 查看标题Go Garbage Collector
。 如果你愿意的话,该页面甚至可以链接到当前版本的代码。
垃圾收集与否,你可以编写一个程序,在Java,Go或其他任何语言的大部分内存泄漏。
垃圾收集确实减轻了程序员的负担,但并不能完全防止泄漏。
“内存泄漏”是程序员认为释放的一块内存没有被释放的时候。 这可以发生在任何语言,垃圾收集或不。 GC语言的通常原因是保留对内存的额外参考。
“语言不会造成内存泄漏,程序员造成内存泄漏”。
你在这里混合了抽象层次:内存泄漏是由于库中的错误(对象通过'a持有引用b'链相互引用,以及垃圾收集器在效率和准确性,你想花费多less时间来找出这样的循环?如果花费两倍,你将能够检测循环两次。
所以内存泄漏问题不是编程语言特定的,没有理由认为它本身GO应该比Java更好或更差。