オブジェクトの作成には時間がかかることを知っているため、フライウェイト パターンが存在します。私が知りたいのは、単一のオブジェクトを作成する時間を最も長くするものは何ですか?
メモリ内の少し大きいスペースの検索かもしれないと思ったのですが、オブジェクトが持つ各フィールドよりもわずかに大きいだけだと思います。次に、特定のフィールドの値を探している間にメモリ内の正しいアドレスに移動する可能性がありますが、追加したのはオブジェクトのアドレスを探すことだけです。
オブジェクトの作成には時間がかかることを知っているため、フライウェイト パターンが存在します。私が知りたいのは、単一のオブジェクトを作成する時間を最も長くするものは何ですか?
メモリ内の少し大きいスペースの検索かもしれないと思ったのですが、オブジェクトが持つ各フィールドよりもわずかに大きいだけだと思います。次に、特定のフィールドの値を探している間にメモリ内の正しいアドレスに移動する可能性がありますが、追加したのはオブジェクトのアドレスを探すことだけです。
オブジェクトの作成にコストがかかる方法は 3 つあります。
1) オブジェクトの割り当て。これは実際には非常に安価です (一部のナノのように)。
多くのオブジェクトには、暗黙的に割り当てられる「埋め込み」オブジェクトがあります。
さらに、多くの場合、コンストラクターの実行 (オブジェクトの初期化) の時間は、実際の割り当てよりもコストがかかります。
2) どの割り当ても Eden スペースを消費するため、割り当て率が高いほど、GC によってより多くの CPU が消費されます (NewGen GC はより頻繁に実行されます)。
3) CPU キャッシュ。一時オブジェクトを割り当てる場合 (たとえば、HashMap に配置するときに Integer を使用すると、これらの一時オブジェクトは L1 キャッシュに配置され、他のデータが削除されます。一度しか使用しない場合、これは効果がありません。したがって、割り当て率が高くなります (特に一時オブジェクト/不変オブジェクト)。キャッシュミスにつながり、場合によっては大幅な速度低下を引き起こします (アプリが実際に何を達成しようとしているかによって異なります)。
もう1つの問題はライフサイクルです。VM は、存続期間が最も短いオブジェクトまたは存続期間が非常に長いオブジェクトを処理できます。アプリケーションが中年期のオブジェクト (キャッシュなど) を大量に作成する場合、フル GC の頻度が高くなります。
フライウェイトのパターンについて。場合によります。非常に小さいオブジェクトの場合、フライウェイトはしばしば報われません。ただし、使用パターンに flyweight 候補オブジェクトの多くの割り当てが含まれる場合は、flyweight'ing が効果を発揮します。これが、ホットスポットがデフォルトで 10.000 個の整数オブジェクトを内部的にキャッシュする理由です。