Можно ли сделать так, чтобы сборщик мусора управлял временем жизни собственного объекта?

Имея опыт работы с C ++ и C # и немного разбираясь в Java, я начинаю проект Java + JNI (C ++) (Android, если это важно) .

У меня есть собственный метод, который создает некоторый класс C ++ и возвращает указатель на него как длинное значение Java (скажем, дескриптор). А затем другие собственные методы, вызываемые из кода Java здесь и там, используют дескриптор в качестве параметра для выполнения некоторых собственных операций с этим классом. Сторона C ++ не владеет объектом, она владеет стороной Java. Но в текущей архитектуре сложно определить, кому именно принадлежит объект и когда его удалять. Так что, вероятно, было бы неплохо сделать сборщик мусора Java VM, чтобы как-то управлять временем жизни объекта. Класс C ++ не потребляет никаких ресурсов, кроме некоторого небольшого фрагмента памяти. Так что ничего страшного, если несколько таких объектов не будут разрушены.

В C # я бы, вероятно, обернул собственный дескриптор IntPtr в какой-нибудь управляемый класс-оболочку. И переопределите его финализатор для вызова деструктора собственного объекта, когда управляемая оболочка собирается сборщиком мусора. Здесь также могут помочь SafeHandle, AddMemoryPressure и т. Д.

Это другая история с завершением Java. Второе, что вы знаете после «Hello world» в Java, это то, что использование finalize - это плохо. Есть ли другие способы сделать это на Java? Может быть, с помощью PhantomReference?

5
задан Alex Che 15 July 2011 в 22:58
поделиться