Есть ли какая-либо возможность в Java создать block memory allocator ?
Изначально думал сделать это через JNI, но ведь нельзя ни вернуть поинтер оттуда, чтобы аллоцировать память, не отдать его обратно, чтобы деаллоцировать
При этом есть приложения, написанные на языках, имеющих GC, которые бы никогда не работали должным образом без кастомного аллокатора. А значит разработчики данных приложений как-то решили этот вопрос
acwartz, например, сервера Battlefield, Skyforge (именно механика) были написаны на Java. Совершенно очевидно, что, когда за секунду создаётся по 10к объектов, через new это не сделать. Но при этом данные сервера неплохо функционируют, значит всё-таки было найдено какое-то решение
Если честно не совсем понял, как его применить для данной цели
Мне ведь нужен следующий интерфейс void* allocate(int size), void free(void* p, int size) (понятно, что в Java нет void*, но всё же, для понятности я его добавил).
Так вот после получения указателя мне нужно вызвать placement new как-то по нему, это выглядит примерно так:
Аллокация:
void* mem = allocator.allocate(sizeof(Body));
Body* b = new (mem) Body();
Деаллокация: allocator.free(b, sizeof(Body));
Может быть, используя JNI можно как-то скормить java класс, чтобы там внутри выделилась память, вызвался placement new на этот участок новой памяти с переданным классом, и вернулась бы ссылка на новый объект уже в java код?
bakdurak, ByteBuffer.allocateDirect(someSize) вернёт вам буффер в нативной памяти, но писать в буфер и читать из него вы можете только примитивы. Для большинства задач, производительность которых может ограничивать сборщик мусора, этого вполне достаточно. В тех случаях, когда нужно что-то большее костылят такое или такое. Беда с этими решениями, что разработчики JVM им не очень рады и постоянно закручивают гайки. Foreign-Memory Access API должен облегчить разработку таких решений.