4

特定のエンドポイントへのリクエストに応答して、非常に多くのバックグラウンド ワーカー スレッドを生成する Web アプリケーションがあります。ワーカーの状態の透明性を高めるために、ワーカーがイベントを投稿できるイベント バスを追加しました。イベントはマップにプッシュされ、各ワーカーの状態を経時的に追跡します。定期的にマップのスナップショットが作成され、より永続的な場所にプッシュされます。スナップショットはリクエスト トークンを介してリクエストに関連付けられます。

各リクエストに独自のイベント バスを提供することは確かに魅力的です。次に、各リクエストは独自のマップを取得します。要求が完了し、最終的なスナップショットがプッシュされると、マップとイベント バスが範囲外になり、その結果、ガベージ コレクションが実行されます。

少なくとも、それが理論です。しかし、私が話した一部の人々は、イベント バスへの唯一の明示的な参照が範囲外になった場合でもイベント バスが収集されないことを示唆していました。より経験豊富な Java/Guava 実践者の視点に本当に感謝しています。

4

1 に答える 1

3

EventBusオブジェクトへの参照がなくなったときにオブジェクトがガベージ コレクションされるのを妨げるものは何もありません。ソースコードを見ることができます。

彼ら言及しているのは、インスタンス間で共有されるEventBusいくつかのキャッシュがあるという事実です。それらはガベージコレクションされません。キャッシュは次の 2 つのことを行います。staticEventBus

  • EventBus.flattenHierarchyCacheクラス (サブスクライバー メソッドがサブスクライブするイベントの型) のマップを、すべてのクラスのセットと、それらのクラスのそれぞれが拡張または実装するインターフェイスに保持します。
  • AnnotatedSubscriberFinder.subscriberMethodsCacheクラス (サブスクライバー メソッドを持つクラス) のマップを、 で注釈が付けられたクラスのメソッドに保持し@Subscribeます。

これらのキャッシュのサイズは、それぞれに投稿するさまざまなタイプのイベントEventBusの数と、それぞれに登録するさまざまなクラスの数によって制限されますEventBus。したがって、たとえば、1 つのタイプのイベントのみを投稿し、イベント バスに登録するクラスが 1 つしかない場合、キャッシュは小さくなり、そのままになります。

于 2013-10-02T16:02:18.373 に答える