【发布时间】: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