clear()impl JavaのLinkedList
-
05-09-2019 - |
質問
私は恐れであるか質問ですが、これを:
のはなぜですかclearメソッドJavaのデフォルトのLinkedList実施べ歩きのリストunhookすべてのノード?なぜならずunhookのヘッダの残りのリスト接続のGCますか?
この方法:
/**
* Removes all of the elements from this list.
*/
public void clear() {
Entry<E> e = header.next;
while (e != header) {
Entry<E> next = e.next;
e.next = e.previous = null;
e.element = null;
e = next;
}
header.next = header.previous = header;
size = 0;
modCount++;
}
なぜ徒歩ですか?なぜならずにスキップ header.next = header.previous = header;
?
ベストできます図では、GC...?このリンク http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 のようなことを示唆する。
TIA...
解決
彼らの方法は、他のコードがまだ特定のノードへの参照を保持している場合であっても、他のノードがGC'edされることを確実にする。
そうでない場合、収集されるのチェーン全体を妨げるノードの1つにあっても単一の外部リファレンス
また、リスト内の他の操作は、(subList()
またはCollections.unmodifiableList()
通じ例えばビュー、イテレータ)が同時に起こっていることがあり、これはそれらのものはすぐに「空」としてリストを知覚することを保証します。
他のヒント
IIRC、これは特定の(世代)GCアルゴリズムの性能を支援するためJDK6に行われた変更でした。多くの場合、List
自体と古いノードは他のノードのいくつかのより古い世代になります。若い世代が若いノードは、すべてのノードがゴミであることを発見される前に、約コピーされます、その結果、より頻繁に収集されます。
だから、マイナーなパフォーマンスの最適化です。メモリのパフォーマンスの最適化は、多くの場合、それが実行するための追加の時間がかかっている問題を引き起こしているコードではないという点で少し奇妙です。
私はちょうど私のゲーム開発ブログにこの非常に問題を推測されました。答えてくれてありがとう。私は、ノードの露出が疑わしいデザイン手当だったと主張していると思います。それは、リスト上の代替ビュー(イテレータと、そのような)は、フェイルファストためにノードリンク解除に依存しているということも大ざっぱです。代わりに、この副作用の行動に依存するのは、リスト上のサブビューは変更回数をチェックする必要があります。彼らは今それで立ち往生している理由はいずれにせよ、私は見ています。
のソースコード java.util.LinkedList 時 http://developer.classpath.org/doc/java/util/LinkedList-source.html ることを示唆することさえ可能ですセットの最初の要素はnullのままになります。
もちろんだが過保護できてループすることになります。と思っていることが非常に高価なタスクの場合はリストの開催数千人。