如果我删除所有对我已订阅的可观察对象的显式引用,它是否会被垃圾收集?

tre*_*ell 5 garbage-collection rx-java

我有一个可以从远程服务器发出响应的observable.我订阅了一个将结果填入缓存的操作.

  • 一旦我对原始观察者的所有明确引用都消失了,上面提到的副作用行为是否会失败?
  • 更一般地说,作为垃圾收集和rxjava的rxjava用户,我需要知道什么?

奖励:这是一个clojure实验,展示了在订阅者的情况下观察到的可观察性,或者它可能只显示了订阅可观察者的副作用.

(ns adhoc.rx-gc
  "Testing behavior of RxJava and garbage collection."
  (:require [rx.lang.clojure.core :as rx])
  (:import (java.lang.ref WeakReference)
           (java.util.concurrent TimeUnit)
           (rx Observable)))

(defn test-gc
  [sub?]
  ;; Hold source in an atom to be sure we can wipe references to it
  ;; and not worry about lexical scope.
  (let [a-src (atom (.delay (rx/return "hello") 5 TimeUnit/SECONDS))
        w-src (WeakReference. @a-src)]
    (when sub?
      (rx/subscribe @a-src
                    #(do (println "Value:" %)
                         (println "On-update ref:" (.get w-src)))))
    (reset! a-src nil)
    (System/gc)
    (println "After-gc ref:" (.get w-src))))

(comment
  (test-gc false)
  ;; After-gc ref: nil

  (test-gc true)
  ;; After-gc ref: #<Observable rx.Observable@21863f3b>
  ;; Value: hello
  ;; On-update ref: #<Observable rx.Observable@21863f3b>
)
Run Code Online (Sandbox Code Playgroud)

zsx*_*ing 1

一旦我自己对原始可观察值的所有显式引用都消失了,上面提到的副作用操作是否会存在无法执行的危险?

这取决于。如果您使用,则在某些线程中Scheduler可能会存在对您的隐式引用。ObservableScheduler

更一般地说,作为 rxjava 用户,我需要了解关于垃圾收集和 rxjava 的哪些信息?

确保Subsscription.unsubscribe在想要释放资源时调用,并且永远不要忽略Subscription返回的 s Observable.subscribe。