Языковые привязки с использованием несжатой памяти для языков без гарантированных деструкторов? - PullRequest
5 голосов
/ 27 июля 2011

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

EDIT: То, о чем я думаю (я знаю, что в моем исходном вопросе это явно не указано) - это когда часть памяти, не связанной с gc, содержит ссылки на другие ресурсы, не связанные с gc, которые нужно освобождать, когда этот объект освобождена. Например, если у вас есть узел связанного списка, не связанный с gc, который является главой длинного списка таких узлов, и вы хотите, чтобы система gc в конце концов автоматически его очистила, как вы это настроите?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Как правило, они предоставляют API для создания и выпуска ссылки.

Например, собственный интерфейс Java предоставляет глобальные ссылки, которые позволяют закреплять объект Java в памяти до тех пор, пока программа C не завершит его с помощью NewGlobalRef и DeleteGlobalRef

NewGlobalRef Создает новую глобальную ссылку на объект, на который ссылается аргумент obj.Аргумент obj может быть глобальной или локальной ссылкой.Глобальные ссылки должны быть явно удалены путем вызова DeleteGlobalRef()

, и он также предоставляет локальные ссылки, которые действуют только до тех пор, пока Java передала управление C для:

Локальные ссылки действительны в течение всего времени вызова нативного метода.Они освобождаются автоматически после возврата нативного метода.

API встраивания JVM предоставляет аналогичный механизм, который позволяет закреплять объект в памяти, пока программа C не определит, что это сделано сit.

API-интерфейс расширения Python C предоставляет API, аналогичный JNI.

Заимствованная ссылка может быть изменена на собственную ссылку путем вызова Py_INCREF().

Владелец ссылки отвечает за вызов Py_DECREF(), когда ссылка больше не нужна.

Имена python отражают тот факт, что python использует подсчет ссылок *, ноAPI в основном такой же, как и в JNI, который основан на сборщике мусора без подсчета ссылок - у вас есть одна функция, которая закрепляет область памяти, управляемую интерпретатором, и функция, которая освобождает ранее закрепленную область обратно в интерпретатор.

* - python - это не настоящий подход к подсчету повторных ссылок.На той же странице «Хотя Python использует традиционную реализацию подсчета ссылок, он также предлагает детектор циклов, который работает для обнаружения циклов ссылок».

2 голосов
/ 03 августа 2011

В Java у вас есть концепция finalize () .Вы можете освободить C-память там.

Однако, вероятно, лучше использовать PhantomReferences вместе с ReferenceQueue .Вы можете расширить класс PhantomReference, чтобы он содержал некоторый идентификатор или указатель или что-либо еще в памяти на стороне C, которую вам нужно освободить.Когда он ставится в очередь в ReferenceQueue, вы можете освободить память на стороне C, на которую указывает этот идентификатор - объект Java гарантированно больше не существует «в Java».

0 голосов
/ 03 августа 2011

При использовании привязок с такими языками, как Java, машина другого языка содержит счетчики ссылок для каждого выделенного объекта.API должен предоставлять методы для увеличения или уменьшения счетчиков тезисов, чтобы указать машину, на которой ваша C-программа содержит ссылку на другие объекты машины.Если программа на Си не имеет ссылок на данный объект, счетчик ссылок может достигнуть 0, и другой языковой компьютер будет свободен для сбора мусора.Тем не менее, вы не сможете попросить компьютер освободить данный объект.

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