我想知道,为什么Java(或基于gc的语言,如C#,GO)除了gc之外,没有其他任何用于直接内存管理工具的工具。
我熟悉JLS和JVM规范,但没有找到任何解释。
当开发人员可以直接删除他肯定不再需要的对象时,它可以提高性能(减少gc的工作量)并减少使用的内存量。
我对python内存规范不熟悉,但是我知道,存在用于内存管理的 gc()方法和关键字 del 。
P.S。我已经搜寻了一个小时,但是我只找到答案,说明我不关心删除内存管理语言中的对象。
答案 0 :(得分:5)
Java始终以安全性为重点,尽管从来没有像易用性那么重要。非垃圾收集的内存管理很难保证使用内存安全,尽管请参阅Rust,以了解更多信息。
好的JVM实现可以在某些时间紧迫的情况下对“堆”对象进行堆栈分配。无论如何,短命对象的GC速度非常快。
您可以使用标准Java类库-java.nio.ByteBuffer.allocateDirect
在GC之外分配内存。 IIRC还没有一种显式取消分配的方法。确实确实需要GC跟踪所有引用。如果需要固定的原语数组,该API会持续整个过程,因此该API会很好用。
答案 1 :(得分:4)
“它可以提高性能”
如何?显式释放内存本身需要时间。这比让GC发挥作用更好?
“减少已使用的内存量”
为什么要关心使用的内存?大多数现代应用程序都采用“高水位标记”策略,其中保留未使用的内存以供将来使用。
“他肯定知道不再需要了”
具有这种确定性的情况越来越少。部署在现代Servlet容器/ Web服务器/ Web框架上的任何Web应用程序,甚至是“ hello world”,都过于复杂,无法让开发人员决定内存管理。
答案 2 :(得分:1)
它或多或少。它调用Unsafe