如何正确取消引用缓冲区?

时间:2011-03-18 20:37:15

标签: java

我的一个项目存在一些内存问题。在我的程序中的几个位置上跟踪了一些内存之后,我将问题回溯到这一行:

(FloatBuffer)lightBuffer.asFloatBuffer().put(lightAmbient).flip()

我正在使用函数中的结果缓冲区,但似乎浮动缓冲区在使用后没有清空。 那么如何在java中正确清空/取消引用缓冲区呢?

ps:我尝试了clear()方法,但根据java文档只重置了缓冲区;它不会从中删除数据。

3 个答案:

答案 0 :(得分:2)

您是否在某处存储了对此缓冲区的引用?我不认为你可以从缓冲区中明确地“删除数据”,System.gc()对你没有帮助。

除非您要维护对此缓冲区的引用,否则垃圾收集器应自动为您处理。

答案 1 :(得分:2)

假设您的lightBuffer是ByteBuffer(似乎没有其他类有方法asFloatBuffer),您的FloatBuffer对象只是围绕同一底层byte[]或本机内存的包装器。 / p>

这个FloatBuffer对象不再占用任何内存(但使用lightBuffer使用的相同内存),但它可能会阻碍ByteBuffer的垃圾收集 - 但似乎你正在重用这个,不要你?

所以到目前为止似乎没有问题(除了你不知道有几个Buffers使用相同的内存)。

答案 2 :(得分:0)

呃,你没有。

NIO缓冲区不会浪费时间,它们会覆盖缓冲区中的数据并移动标记。

如果你想要摆脱它,你必须摆脱它的所有引用,并使其可用于GC,以便它可以收集。