Как только экземпляр службы OSGi
извлекается из контекста пакета
он становится недействительным, когда служба
остановлен?
Нет, сама ссылка не становится недействительной. Пока что-то внутри контейнера удерживает его, оно также не может быть GC'ed.
Однако, будет ли он по-прежнему полезен, зависит только от самой реализации сервиса, а не от контейнера.
Мои первоначальные тесты показывают, что экземпляр службы можно использовать даже после остановки пакета услуг>, что противоречит моему пониманию динамической природы OSGi.
В самих спецификациях указывается, что такие ссылки не должны храниться, но разработчик должен позаботиться о правильной реализации спецификаций; означает, что нет никакого противоречия, есть только тот факт, что вы можете внедрять и развертывать пакеты, которые ведут себя неправильно в соответствии со спецификациями.
Я полагаю, это сводится к тому, что получение службы (через ServiceTracker) из другого пакета
в контейнере OSGi фактически делает, создает ли он новый экземпляр или дает вам указатель
к экземпляру, который зарегистрирован в контейнере?
Контейнер не создает новые экземпляры сервисов, кроме случаев, когда задействован ServiceFactory (см. Спецификации). Поиск службы всегда должен указывать на зарегистрированный экземпляр в контейнере.
Есть ли какие-либо опасности в использовании экземпляра службы после остановки службы?
Это зависит только от реализации сервиса; однако, делая это в пакете, вы автоматически создаете пакет, который не соответствует спецификациям.
На практике многие службы реализованы для освобождения ресурсов и ссылок и больше не будут отвечать должным образом.