2017-02-07 1 views
2

Observableには最初に発行された値までトレースできるキャッシュがあるので、このキャッシュを格納するために使用されるメモリの量は制限されていないようです。Observableには無限のメモリが必要ですか?

Observable.interval(1.microsecond).map(_ => System.currentTimeMillis) 
    .subscribe(x =>()) 

をアプリの実行中に実際にメモリ使用量が着実に全体の10分の期間中に上昇している。

は、私は次のコードでこの仮定をテストしてみました。


それはキャッシュなしの特別Observableをインスタンスまたは多分それはいくつかのレベルでのキャッシュだキャップするためにそれを指示することができるかどう私の質問はありますか?

+2

ある時点ですべてがGCされないことは確実ですか? – Carcigenicate

+0

@Carcigenicate 10分は、GCが仕事をするのに十分な間隔のようです。さらに、論理キャッシュは、すべての値を格納し、 'Observable'がアクティブである間に参照解除されていないのでGCしないでください。 – Anton

+0

まだ、VisualVMを開いてGCを強制すると試してみる価値があります。 Observableがどのように機能するのかは分かりませんが、オブジェクトには永久に保持されるプログラムがいくつかあったことがわかりました。使用率が高くなると自動的にクリアされます。 – Carcigenicate

答えて

6

Observable(ReplaySubject、replay()、GroupedObservableなど)の特定のセットのみがアイテムをキャッシュする傾向がありますが、Observable.interval()ではキャッシュされません。

ここで発生する可能性が高いのは、数十万のボックス化されたLong値です。 RAMが大量の場合は、GCが起動しない場合がありますが、ヒープサイズを最大限に増やすだけです。 1マイクロ秒のタイマーを実際に得ることができると仮定すると、およそ24 MB /秒の割り振り速度または1.4 GB /分の割り振り速度を持ちます。 10分間放置すると、メモリ使用量に鋸歯状のように見える可能性があります。

関連する問題