![](/img/trans.png)
[英]“More produced than requested” exception when using `replay` and `autoConnect`
[英]OOM when using replay(selectorFoo) but not publish(selectorFoo)
這會因OOM而崩潰:
Flowable.range(1, 5000)
.map(__ -> new byte[1024 * 1024])
.replay(
fb ->
fb.take(1)
.concatMap(__ -> fb)
,1
)
.count()
.toFlowable()
.blockingSubscribe(c -> System.out.println("args = [" + c + "]"));
我想這是因為replay
一直在保持上游的排放,盡管我本來以為1
緩沖區sizse提示會使它不...。我錯過了什么?
這不會崩潰:
Flowable.range(1, 5000)
.map(__ -> new byte[1024 * 1024])
.publish(
fb ->
fb.take(1)
.concatMap(first -> fb.startWith(first))
,1
)
.count()
.toFlowable()
.blockingSubscribe(c -> System.out.println("args = [" + c + "]"));
但是我不確定我是否能保證會像這樣從上游獲得所有排放物...
我對此進行了調查,發現了問題的原因:RxJava 2中的replay
錯誤。
什么情況是, replay
持有引用2個用戶,一個是take
,另一個為concatMap
在一個局部變量的內部消費,從而有來自主線程已不存在的一個GC根take
還是引用的第一個項目。 由於有界重放使用鏈表,因此該第一項將繼續通過其“下一個”鏈接引用更新的項目,並最終耗盡內存。
publish
不會保留對舊值的引用,因此這不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.