我的一个项目存在一些内存问题。在我的程序中的几个位置上跟踪了一些内存之后,我将问题回溯到这一行:
(FloatBuffer)lightBuffer.asFloatBuffer().put(lightAmbient).flip()
我正在使用函数中的结果缓冲区,但似乎浮动缓冲区在使用后没有清空。 那么如何在java中正确清空/取消引用缓冲区呢?
ps:我尝试了clear()方法,但根据java文档只重置了缓冲区;它不会从中删除数据。
答案 0 :(得分:2)
您是否在某处存储了对此缓冲区的引用?我不认为你可以从缓冲区中明确地“删除数据”,System.gc()对你没有帮助。
除非您要维护对此缓冲区的引用,否则垃圾收集器应自动为您处理。
答案 1 :(得分:2)
假设您的lightBuffer
是ByteBuffer(似乎没有其他类有方法asFloatBuffer
),您的FloatBuffer对象只是围绕同一底层byte[]
或本机内存的包装器。 / p>
这个FloatBuffer对象不再占用任何内存(但使用lightBuffer
使用的相同内存),但它可能会阻碍ByteBuffer的垃圾收集 - 但似乎你正在重用这个,不要你?
所以到目前为止似乎没有问题(除了你不知道有几个Buffers使用相同的内存)。
答案 2 :(得分:0)
呃,你没有。
NIO缓冲区不会浪费时间,它们会覆盖缓冲区中的数据并移动标记。
如果你想要摆脱它,你必须摆脱它的所有引用,并使其可用于GC,以便它可以收集。