簡體   English   中英

使用重播(selectorFoo)但不發布(selectorFoo)時的OOM

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM