【问题标题】:If I drop all explicit references to an observable I've subscribed to, will it be garbage collected?如果我删除对我订阅的 observable 的所有显式引用,它会被垃圾收集吗?
【发布时间】:2017-05-07 05:17:34
【问题描述】:

我有一个从远程服务器发出响应的 observable。我通过一个将结果填充到缓存中的操作来订阅它。

  • 一旦我自己对原始 observable 的所有显式引用都消失了,是否存在上述副作用操作无法执行的危险?
  • 更一般地说,作为 rxjava 用户,我需要了解关于垃圾收集和 rxjava 的哪些信息?

奖励:这是一个 clojure 实验,展示了当有订阅者时,一个 observable 被保留,或者它只是显示了订阅 observable 的副作用。

(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>
)

【问题讨论】:

    标签: garbage-collection rx-java


    【解决方案1】:

    一旦我自己对原始 observable 的所有显式引用都消失了,是否存在上述副作用操作无法执行的危险?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多