ガベージ コレクター (メモリ リクレイマー) の動作の流れ
ガベージ コレクターがメモリを自動的に管理するため、Java プログラマはメモリ割り当てを監視する必要がありません。ガベージ コレクターは Java 仮想マシン (JVM) によって実行されます。ガベージ コレクターは、定期的に実行され、不要になったオブジェクトによって使用されているメモリを解放する優先度の低いプロセスです。JVM が異なれば、ガベージ コレクション アルゴリズムも異なります。たとえば、参照カウント アルゴリズム、マークアップおよびスクレイピング アルゴリズムなど、いくつかのアルゴリズムが使用されます。
Java でガベージ コレクターを実行する
通常、JVM は空きメモリが少ないときにガベージ コレクターを実行します。ただし、ガベージ コレクターの動作によって、常に十分な空きメモリがあることが保証されるわけではありません。リカバリ後でも十分なメモリがない場合、JVM は OutOfMemoryError 例外をスローします。JVM は例外をスローする前に少なくとも 1 回ガベージ コレクターを実行する必要があることに注意してください。Java でガベージ コレクターを実行するように要求できますが、このアクションを強制することはできません。
ガベージ コレクターの実行リクエスト
リクエストを行うには、次のいずれかのメソッドを呼び出します。
System.gc()
Runtime.getRuntime().gc()
ガベージ コレクターの実行への適合性
オブジェクトは、ライブ ストリームで使用できなくなった場合には破棄する必要があります。オブジェクトはさまざまな場合に処分の対象となる場合があります。
- オブジェクトを参照する参照型の変数が「0」に設定されている場合、そのオブジェクトへの参照が他にない場合は、そのオブジェクトを破棄する必要があります。
- オブジェクトを参照する参照型の変数が別のオブジェクトを参照するために作成された場合、そのオブジェクトへの参照が他にない場合は、そのオブジェクトを破棄する必要があります。
- メソッド内でローカルに作成されたオブジェクトは、そのメソッドからエクスポートされない限り (つまり、例外として返されるかスローされない限り)、メソッドの終了時に破棄されます。
- 相互に参照するオブジェクトは、ライブ スレッドで使用できるオブジェクトがない場合、破棄される可能性があります。
例を見てみましょう:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
この例では
Integer
、o1 がオブジェクト (文字列) を参照しているため、最初に o1 によって参照されていたオブジェクト (整数) は 3 行目以降で破棄できます
String
。o2 は null を参照するように作成されていますが、o1 が参照しているため、オブジェクト
String
(文字列) は再利用できません。
ファイナライズ
Java テクノロジを使用すると、メソッド
finalize()
(ファイナライズ) を使用して、ガベージ コレクターがメモリからオブジェクトを取得する前に必要なクリーンアップを実行できます。このメソッドは、オブジェクトへの参照がもう存在しないとガベージ コレクターが判断した場合に、ガベージ コレクターによってオブジェクトに対して呼び出されます。これは class に記述されており
Object
、すべてのクラスに継承されることを意味します。サブクラスはメソッドをオーバーライドして、
finalize()
システム リソースから自身を解放したり、別のクリーンアップを行ったりします。
protected void finalize() throws Throwable
未登録の例外がメソッドによってスローされた場合
finalize()
、その例外は無視され、そのオブジェクトのファイナライズは停止します。このメソッドは、
finalize()
オブジェクトの存続期間中に 1 回だけ呼び出されます。
finalize()
あらゆるオブジェクトに対してメソッドを使用して、オブジェクトを廃棄から保護することができます。ただし、この場合、
finalize()
このオブジェクトに対してガベージ コレクターはアクティブ化されなくなります。このメソッドは、
finalize()
オブジェクトがガベージ コレクションされる前に必ず 1 回呼び出されます。
finalize()
ただし、特定のオブジェクトは破棄の対象にならないため、そのオブジェクトが存在する間ずっとそのオブジェクトに対して メソッドがアクティブ化されない可能性があります。
まとめ
このセクションでは、Java 言語のメモリ管理手法であるガベージ コレクション プロセスについて説明しました。ガベージ コレクションを強制することはできません。オブジェクトをリサイクルの対象にするさまざまな方法について学び、
finalize()
オブジェクトがガベージ コレクターによって再利用される前にこのメソッドが呼び出されることを学びました。
エクササイズ
質問: 7 行目以降に処分の対象となるオブジェクトはいくつありますか?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
回答選択肢: A. 0 B. 1 C. 2 D. 3 E. コードをコンパイルできません
正解選択肢: B
説明:行 1、2、および 3 で作成された 3 つのオブジェクトのうち、オブジェクトのみを
Integer
最初の時点で破棄する必要があります。 7 行目の終わり。 変数参照 a は最初に object を参照していましたが
Integer
、
String
5 行目で
Integer
オブジェクトを参照します。したがって、オブジェクトを参照する変数がないため、5 行目以降でオブジェクトを破棄する必要があります。変数
b
と6 行目と 7 行目では
c
オブジェクト
String
と
Long
オブジェクトを参照しているため、再利用できません。
GO TO FULL VERSION