В настоящее время мы разрабатываем приложение, которое визуализирует огромные векторные поля (> 250'000) на сфере / плоскости в 4D.Чтобы ускорить процесс, мы используем VBO для вершин, нормалей и цветов.Для подготовки данных перед отправкой в графический процессор мы используем буферы (FloatBuffer, ByteBuffer и т. Д.).
Некоторые данные для цилиндров: каждый цилиндр использует 16 * 9 + 16 * 3 = 192 числа с плавающей запятой -> 192 * 4 байта = 768 байтов.
После отправки вершин мы выполняемследующая очистка:
// clear all buffers
vertexBufferShell.clear();
indexBufferShell.clear();
vertexBufferShell = null;
indexBufferShell = null;
Мы наблюдали за этим с помощью JConsole, и мы обнаружили, что GarbageCollector не работает "правильно".Даже если мы выключим счетчик цилиндров, память не освободится.В инструменте мониторинга JConsole есть кнопка для запуска ГХ, и если мы делаем это вручную, это освобождает память (если мы загрузили огромное количество цилиндров и сильно его уменьшили, иногда ГХ очищает более 600 МБ).
Вот изображение JConsole: 
Теперь вопрос заключается в том, как мы можем самостоятельно очистить этот буфер в коде?Вызов метода clear и установка ссылки на null недостаточно.Мы также пытались вызвать System.gc () , но безрезультатно.У вас есть идеи?