AVA - Garbage Collection
今回のリリースでは、Javaの主な機能の一つであるGarbage Collectionについて説明します.
プログラムを開発する際、
メモリを使用して必要なデータを使用し、後続のデータを使用して開発する場合は、使用するメモリを保持できます.
メモリを使用して不要なデータを処理します.
限られたリソースメモリでは、かなりの無駄が発生します.
これがメモリの漏洩です.
また,このような事態を防止するためには,使用したメモリを返却する必要があり,これらのメモリを処理してユーザが速やかに返却できるようにすることは困難である.
ここで,これらすべての要件を満たすのがJavaのGarbage Collectionである.
Heap領域のデータが使用できなくなった場合、自動的にそのデータを返します. 機能的にはC/C++のようなものを思い出すはずです.
そうですね.
に示すようにすればよい.
C/C++では、動的に割り当てられたメモリは開発者自身が返却する必要がありますが、JavaではJVMのGarbage Collectorによって自動的に実行されます.
次に、
つまり、どのようなアルゴリズムを使用しているのかを理解してみましょう.
これまでGarbage Collectionで使われていたアルゴリズムは本当に多かった. Reference Counting Algorithm Mark-and-Sweep Algorithm Mark-and-Compact Algorithm
.
.
. しかし、今回のリリースでは、Reference Counting Algorithmの1つについて議論します.(実際、他のアルゴリズムはよくわかりません.😅)
このアルゴリズムはreferencecount変数によってオブジェクトに参照があるかどうかを判断し、詳細は以下の通りである.
オブジェクトを作成すると、オブジェクトが存在するアドレス(Heap)のパラメータreferencecountと実際の値が1に初期化されます.
このとき、次のコードを追加すると何が起こるかを見てみましょう.
前述したように、heap領域で1000番アドレスを参照するオブジェクトがもう1つ追加され、referencecountの値が1増加したことがわかります.
最終的に、referencecount=0の場合、Garbage Collectionによってheapからメモリが削除されます.
Reference Counting Alogrithmはcount変数の増減を参照することでオブジェクトの参照が存在するか否かを判断するので、Java以外にもGarbage Collection機能のない言語でも容易に実現できるなどの利点がある.
でも.
heap領域に割り当てられたオブジェクトが多ければ多いほど、各オブジェクトのreferencecount変数をチェックするたびに負荷が大きくなります.また、オブジェクト間に参照(Circular Reference-接続リスト)がある場合、「循環参照」エラーで参照が取り消されますか?Garbage Collectionではメモリを削除する必要がありますが(図では変数Aとして示しています)、オブジェクトを参照している他のオブジェクトは削除されません.
参考資料:ウィキペディア・参照数、ブログGarbage Collection Algorithm お読みいただきありがとうございました. メッセージを書き間違えていただき感謝に堪えません.
プログラムを開発する際、
メモリを使用して必要なデータを使用し、後続のデータを使用して開発する場合は、使用するメモリを保持できます.
メモリを使用して不要なデータを処理します.
限られたリソースメモリでは、かなりの無駄が発生します.
これがメモリの漏洩です.
また,このような事態を防止するためには,使用したメモリを返却する必要があり,これらのメモリを処理してユーザが速やかに返却できるようにすることは困難である.
ここで,これらすべての要件を満たすのがJavaのGarbage Collectionである.
💡 Garbage Collection
そうですね.
👉 動的に割り当てられたメモリをC/C++に戻すプロセス
に示すようにすればよい.
C/C++では、動的に割り当てられたメモリは開発者自身が返却する必要がありますが、JavaではJVMのGarbage Collectorによって自動的に実行されます.
次に、
💡 Garbage Collectionはどのように操作されていますか?
つまり、どのようなアルゴリズムを使用しているのかを理解してみましょう.
これまでGarbage Collectionで使われていたアルゴリズムは本当に多かった.
.
.
.
このアルゴリズムはreferencecount変数によってオブジェクトに参照があるかどうかを判断し、詳細は以下の通りである.
オブジェクトを作成すると、オブジェクトが存在するアドレス(Heap)のパラメータreferencecountと実際の値が1に初期化されます.
String A = new String("abc");
referencecountの例として、上記のコードを図に示します.このとき、次のコードを追加すると何が起こるかを見てみましょう.
String B = A;
前述したように、heap領域で1000番アドレスを参照するオブジェクトがもう1つ追加され、referencecountの値が1増加したことがわかります.
最終的に、referencecount=0の場合、Garbage Collectionによってheapからメモリが削除されます.
Reference Counting Alogrithmはcount変数の増減を参照することでオブジェクトの参照が存在するか否かを判断するので、Java以外にもGarbage Collection機能のない言語でも容易に実現できるなどの利点がある.
でも.
heap領域に割り当てられたオブジェクトが多ければ多いほど、各オブジェクトのreferencecount変数をチェックするたびに負荷が大きくなります.また、オブジェクト間に参照(Circular Reference-接続リスト)がある場合、「循環参照」エラーで参照が取り消されますか?Garbage Collectionではメモリを削除する必要がありますが(図では変数Aとして示しています)、オブジェクトを参照している他のオブジェクトは削除されません.
.
.
.
JAVA-GArbage Collection[終了]
Reference
この問題について(AVA - Garbage Collection), 我々は、より多くの情報をここで見つけました https://velog.io/@sjongyuuu/JAVA-Garbage-Collectionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol