JAvaのループ参照
2065 ワード
C++でスマートポインタを使用したことがある学生たちは、スマートポインタがC++のメモリ管理に極めて便利であることを知っているはずですが、スマートポインタがもたらす循環参照の問題など、頭の痛い問題も導入され、この問題はこれまでのプロジェクトではよく解決されていませんでした.最近androidのプロジェクト開発に参加し、javaのメモリの管理について初歩的な理解を得て、循環参照の問題を簡単に考えました.たとえば次の例です.
“It’s important to note that not just any strong reference will hold an object in memory. These must be references that chain from a garbage collection root. GC roots are a special class of variable that includes Temporary variables on the stack (of any thread) Static variables (from any class) Special references from JNI native code”. この言葉は簡単に理解できるが、強い引用は対象が回収されないことを保証するものではない.ゴミ回収メカニズムは、オブジェクトが参照されているかどうかを確認するほか、オブジェクトが少なくとも1つのGC rootsオブジェクトに直接または間接的に参照されているかどうかを確認します.GC rootsオブジェクトには、1スレッドごとに現在の関数呼び出しスタック、スタックの上部からスタックの下部までの各関数のローカル変数が含まれます.2静的変数3 jniで参照される変数.したがって,上記の例の2つのループ参照のオブジェクトは,いずれも強い参照が存在するが,GC rootオブジェクトに直接または間接的に参照されず,ゴミ回収メカニズムによってこの問題を発見することができる.また、それを検証するために、androidソースコードのGC管理ブロックのコードをわざわざめくってみました.MarkSweep.cというファイルにはvoid dvmHeapMarkRootSet()関数があります.この関数はGC rootオブジェクトについて、いくつかの詳細な説明があります.興味があれば詳しく見てください.したがってjavaはループリファレンスに対して独自のソリューションを持っています.ところで、一般的に実際の符号化に現れるループリファレンスは、上記の例のように明らかではなく、複数のオブジェクトの複雑なリファレンスによるループが一般的である.この場合、1つのオブジェクトのライフサイクルが長いと、複数のオブジェクトが解放されないため、オブジェクト間のリファレンス関係に特に注意しなければならない.
public void buidDog()
{
Dog newDog = new Dog();
Tail newTail = new Tail();
newDog.tail = newTail;
newTail.dog = newDog;
}
,newTail newDog ,newDog newTail 。 newDog , newTail , newDog 。 ,newTail newDog 。 buildDog , 。
, , 。 《Java Platform Performance: Strategies and Tactics》 A , sun java , 。 (http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997428):
“It’s important to note that not just any strong reference will hold an object in memory. These must be references that chain from a garbage collection root. GC roots are a special class of variable that includes Temporary variables on the stack (of any thread) Static variables (from any class) Special references from JNI native code”. この言葉は簡単に理解できるが、強い引用は対象が回収されないことを保証するものではない.ゴミ回収メカニズムは、オブジェクトが参照されているかどうかを確認するほか、オブジェクトが少なくとも1つのGC rootsオブジェクトに直接または間接的に参照されているかどうかを確認します.GC rootsオブジェクトには、1スレッドごとに現在の関数呼び出しスタック、スタックの上部からスタックの下部までの各関数のローカル変数が含まれます.2静的変数3 jniで参照される変数.したがって,上記の例の2つのループ参照のオブジェクトは,いずれも強い参照が存在するが,GC rootオブジェクトに直接または間接的に参照されず,ゴミ回収メカニズムによってこの問題を発見することができる.また、それを検証するために、androidソースコードのGC管理ブロックのコードをわざわざめくってみました.MarkSweep.cというファイルにはvoid dvmHeapMarkRootSet()関数があります.この関数はGC rootオブジェクトについて、いくつかの詳細な説明があります.興味があれば詳しく見てください.したがってjavaはループリファレンスに対して独自のソリューションを持っています.ところで、一般的に実際の符号化に現れるループリファレンスは、上記の例のように明らかではなく、複数のオブジェクトの複雑なリファレンスによるループが一般的である.この場合、1つのオブジェクトのライフサイクルが長いと、複数のオブジェクトが解放されないため、オブジェクト間のリファレンス関係に特に注意しなければならない.