JNI, Сборка мусора и Указатели - Java / C ++, кто должен что делать? - PullRequest
10 голосов
/ 19 января 2012

У нас есть концепция указателей в C ++.Теперь, если мы выделим некоторую память в C ++ и передадим ее в Java в качестве ссылки на объект (используя JNI), то кто должен быть и кто ее освободит.

Будет ли это

1.) Сборщик мусора делает это автоматически в Java?

2.) Нам нужно явно удалить указатель в завернутом методе класса JNI класса завернутого?

3.) Или мы должны простозабудьте finalize (поскольку финализаторам нельзя доверять), и Java несет ответственность за вызов кода C ++, который удаляет объект

4.) Или есть какой-то способ освободить память непосредственно в самой Java (не знаю, какJava интерпретирует указатель C ++ для его удаления)?

Каков наилучший способ сделать это и наоборот (когда мы передаем объекты из Java в C ++)?

1 Ответ

8 голосов
/ 19 января 2012

У нас есть концепция указателей в C ++.Теперь, если мы выделим некоторую память в C ++ и передадим ее в Java в качестве ссылки на объект (используя JNI), то кто должен быть и кто будет ее освобождать.

Лучшая стратегия - это обычно иметьРаспределитель также будет тем, кто освобождает данные.

1.) Сборщик мусора делает это автоматически в Java?

Проблема в том, что вы не знаетекогда, если вообще когда-либо, он запустится.

2.) Нам нужно явно выполнить удаление указателя в завернутом методе класса JNI класса завернутых?

Лучше иметьметод release () в Java, а не подразумевает, что C ++ должен удалить его.Возможно, вы захотите, чтобы C ++ перезапускал память.

3.) Или нам следует просто забыть финализировать (поскольку финализаторам нельзя доверять), и Java несет ответственность за вызов кода C ++, который удаляет объект

Если вы имеете в виду, выделите память в Java и передайте ее C ++ для заполнения.Это мое предпочтение.

Я бы использовал, может использовать ByteBuffer.allocateDirect (), и вы можете вызвать ((DirectBuffer) buffer).cleaner().clean();, чтобы очистить его детерминистически.

Это может упростить переработку памяти, возможно, можно использовать тот же буферна всю жизнь приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...