我们目前正在开发一个应用程序,它可以在 4D 的球体/平面上可视化巨大的矢量场(> 250'000)。为了加快这个过程,我们对顶点、法线和颜色使用 VBO。为了在发送到 GPU 之前准备数据,我们使用缓冲区(FloatBuffer、ByteBuffer 等)。
柱面的一些数据:每个柱面使用 16 * 9 + 16 * 3 = 192 个浮点数 -> 192 * 4 字节 = 768 字节。
在发送了顶点之后,我们正在进行以下清理:
// clear all buffers
vertexBufferShell.clear();
indexBufferShell.clear();
vertexBufferShell = null;
indexBufferShell = null;
我们使用 JConsole 对其进行了监控,我们发现 GarbageCollector 没有“正确”运行。即使我们关闭柱面计数,内存也不会被释放。在 JConsole 监控工具中有一个运行 GC 的按钮,如果我们手动执行此操作,它会释放内存(如果我们加载了大量的柱面并减少了很多,有时超过 600mb 会被 GC 清理)。
这是 JConsole 的图像:
现在的问题是我们如何在代码中自己清理这个 Buffers?调用 clear 方法并将引用设置为 null 是不够的。我们也尝试调用System.gc()但没有任何效果。你有什么主意吗?