2

だから私はORM/Hibernateからお互いを参照するオブジェクトのチェーンを持っています

  • 大陸
    • 多くの国がある
    • 多くの州がある
    • 多くの都市がある
    • 都市部が多い
    • 1つの国を持っています
    • 多くの州がある
    • 多くの都市がある
    • 都市部が多い
    • 大陸が1つある
    • 1つの国を持っています
    • 多くの都市がある
    • 都市部が多い
    • 大陸が1つある
    • 1つの国を持っています
    • 1 つの状態を持つ
    • 都市部が多い
  • 都市部
    • 大陸が1つある
    • 1つの国を持っています
    • 1 つの状態を持つ
    • 都市が 1 つある

一部のメソッドでは、キーを識別するために簡単な検索を実行できる必要があります。

そのため、私は現在、実行スレッドの存続期間中に無数のデータベースクエリを起動することなく、メモリ内のオブジェクトの ID をすばやく検索できるように、多くのオブジェクトをすべて持っています。

HashMap<Integer,Country>     countriesTable
HashMap<Integer,State>       statesTable
HashMap<Integer,City>        citiesTable
HashMap<Integer,CityPart>    citypartsTable

しかし、私が心配しているのは、循環参照が保持されており、オブジェクトがガベージ コレクションによってクリアされないことです。オブジェクトはすべて ORM リレーションを介して相互に参照し、それぞれにプライベート マップが存在するためです。

WeakHashMap について読んだところ、強い参照がなくなると参照がクリアされます。

問題は、私の状況で WeakHashMap を使用することをお勧めしますか、それとも Hashmap で十分であり、このセットアップと循環参照はメモリ管理を損なうことはありません。

4

1 に答える 1

3

孤立した島 ( ) を構築する 3 つのオブジェクトがA->B->C->Aあり、これらのいずれも他の場所から参照されていない場合、ガベージ コレクションはそれらすべてを問題なく破棄できます。

ただし、キーのみが弱く参照WeakHashMapされるため、あなたの状況では役に立ちません。WeakHashMap(JavaDoc の最初の文WeakHashMapは、「脆弱なキーを使用した Map インターフェイスのハッシュ テーブル ベースの実装です。」) 値は依然としてハード リファレンスです。したがって、WeakHashMapあなたの場合は役に立ちません。キーとして使用される Integer オブジェクトが他の場所 (オブジェクト内など) から参照されていない場合、ガベージ コレクションの対象となり、最終的に破棄されるため、さらに悪いことになります。

必要なのは、HashMap整数オブジェクトが他の場所で参照されていない場合、またはWeakHashMapそれらのオブジェクトがオブジェクト内から参照されているが、値をWeakReferenceインスタンスでラップし、マップチェックからオブジェクトを取得するときに必要な場合は法線です。それらがまだ利用可能かどうか、またはガベージコレクションが行われたかどうか。

于 2016-04-12T13:32:21.223 に答える