Когда и как освобождаются прямые буферы NIO? - PullRequest
5 голосов
/ 08 августа 2009

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

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

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

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

1 Ответ

6 голосов
/ 08 августа 2009

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

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

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

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

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

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

...