Вопрос

У меня есть библиотека C, которой нужен временный буфер для свободного пространства.Я рассматриваю возможность передачи ему адреса прямого байтового буфера.

  • Разрешено ли виртуальной машине когда-либо перемещать буфер до того, как он будет окончательно освобожден?Собственная библиотека будет удерживать указатель после того, как фрейм JNI исчезнет.Насколько я понимаю, ссылки на локальные объекты JNI не могут быть кэшированы, поскольку виртуальная машина может переместить их во время GC.Применимо ли это к адресу буфера?

  • Я понимаю, что виртуальная машина освободит буферную память, если я выделю буфер в Java, а затем позволю объекту buffer выйти за пределы области видимости.Если я создам новый буфер в машинном коде, используя NewDirectByteBuffer, чья ответственность заключается в освобождении резервной памяти?

  • Что произойдет, если я создам новый буфер в машинном коде, используя NewDirectByteBuffer и адрес, уже используемый прямым буфером?Будет ли память освобождена дважды?Будет ли ссылка на виртуальную машину подсчитывать блок памяти и пытаться освободить его, когда последний буфер, ссылающийся на него, будет собран мусором?

Это было полезно?

Решение

Разрешено ли виртуальной машине когда-либо перемещать буфер до того, как он будет окончательно освобожден?

Это не приведет к его перемещению, потому что прямой буфер не является частью кучи GC.

Если я создам новый буфер в собственном коде используя NewDirectByteBuffer, чья ответственность заключается в освобождении резервной памяти?

Вы (машинный код) несете ответственность за его освобождение.JVM могла не знать, какой метод использовался для выделения этого резервного хранилища (может быть malloc'd, может быть статическим буфером и т.д.)

Что произойдет, если я создам новый буфер в машинном коде, используя NewDirectByteBuffer и адрес уже используемый прямым буфером?

Учитывая, что виртуальная машина не будет пытаться освободить память, адрес которой передается в NewDirectByteBuffer, ничего не произойдет, если вы передадите один и тот же адрес дважды.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top