15

java の system.gc() メソッドと finalize() メソッドの間で混乱しています。ガベージ オブジェクトを強制的に JVM に収集することはできません。Java コードに両方のメソッドを記述することが許可されている場合、両方がガベージ コレクションに使用される場合、Java によるガベージ コレクションに 2 つのメソッドを提供する意味は何ですか?

両方のメソッドの正確な動作と、内部でどのように動作するか教えてください。

4

8 に答える 8

13

System.gc()システムにガベージ コレクションを実行するようお願いします。Javadoc は次のように述べています。

ガベージ コレクタを実行します。

ガベージ コレクターがどの程度「ハード」に動作するかを制御することはできません。ガベージ コレクターが内部でどのように機能するかは、VM 固有であり、独自の研究テーマです。しかし、通常は「完全な」ガベージ コレクションと、より小さな「増分」コレクションが行われます。したがってSystem.gc、リクエストとして検討してください。ただし、オブジェクトのガベージ コレクションが発生する保証はありません。

Object.finalize()特定のオブジェクトがガベージ コレクトされたときに何をするかを指定するためにオーバーライドできます (実際には、ガベージ コレクトされる直前に何をするか)。Javadoc は次のように述べています。

オブジェクトへの参照がなくなったとガベージ コレクションが判断したときに、オブジェクトのガベージ コレクタによって呼び出されます。

ファイナライザーの古典的な使用法は、オブジェクトがガベージ コレクションされるときにシステム リソースの割り当てを解除することです。たとえば、ファイル ハンドルや一時ファイルの解放などです。

JVM の終了時にファイナライザーを使用してアクションを実行しないでください。この目的のために、登録したシャットダウン フックを使用しますRuntime.getRuntime().addShutdownHook(Thread)

于 2012-04-17T06:28:19.617 に答える
2

System.gc()Finalize()オブジェクトのメソッドは、この特定のオブジェクトを収集するときにガベージコレクターが何をすべきかを定義しますが、ガベージコレクターを強制的に実行します。

ざっくり言うとこんな感じです。

class MyClass {
    public UnmanagedResource resource;

    void Finalize() {
        FreeUnmanagedResource(resource);
    }
}

MyClass[] data = new MyClass[1000];
for(int i=0; i<1000; i++) {
    data[i] = new MyClass();
}
//do some work
data = null;
System.gc(); //Note that it doesn't guarantee you that all MyClass instances will be actually collected at this point.
于 2012-04-17T06:28:58.803 に答える
1

system.gc()メソッドは、未使用のオブジェクトを削除してメモリをクリアするためにガベージ コレクタを実行できることを JVM に通知します。Javaドキュメントに従って:

gc メソッドを呼び出すということは、Java 仮想マシンが未使用のオブジェクトをリサイクルして、現在占有しているメモリをすばやく再利用できるようにすることを示唆しています。メソッド呼び出しから制御が戻ると、Java 仮想マシンは、破棄されたすべてのオブジェクトからスペースを再利用するために最善を尽くしています。

finalize()メソッドはガベージ コレクターをトリガーしません。代わりに、ガベージ コレクターがオブジェクトを破棄している間に呼び出されます。オブジェクトを適切にクリアするための指示を提供します。

于 2012-04-17T06:34:39.507 に答える
1

ここでの答えは素晴らしいです。finalize() メソッドに関する小さな点を詳しく説明したかっただけです。決して使用しないでください。その実行はまったく保証されず、最終的に finalize() を使用するとパフォーマンスが低下します。

Joshua Bloch の『Effective Java』で次のように書かれています。

ファイナライザは予測不可能で、危険であることが多く、一般的に不要です。ファイナライザでタイム クリティカルなことは決して行わないでください。重要な永続状態を更新するためにファイナライザーに依存することはありません。

と:

ああ、もう 1 つ: ファイナライザーを使用すると、パフォーマンスが大幅に低下します。私のマシンでは、単純なオブジェクトの作成と破棄にかかる時間は約 5.6 ns です。ファイナライザーを追加すると、時間が 2,400 ns に増加します。つまり、ファイナライザーを使用してオブジェクトを作成および破棄すると、約 430 倍遅くなります。

実行が保証されている次のリソース終了 try-finally パターンを使用することをお勧めします。

Bar bar = new Bar(...);
try {
    // Your code here
} finally {
    bar.releaseResource(); // You implementation. For example close connection
}
于 2016-11-09T15:46:30.910 に答える
0

ガベージコレクションは、オブジェクトの割り当てられたメモリを再利用するために使用され、オブジェクトを削除する前に何らかの操作を行うために主に使用されるFinalize()メモリメソッドを再利用する前にガベージコレクタによって呼び出されますFinalize()

于 2012-04-17T06:29:24.933 に答える
0

finalize()メソッドを含むクラスはたくさんありますが、Objectクラスのクラスを意味していると思います。System.gc()は、Javaのガベージコンパイラを実行するときに呼び出すものです。数分ごとに自動的に実行されますが、いつでも実行するように依頼できます。gargabeコレクターが実行されると、参照がなくなった各オブジェクトに対してfinalize()メソッドが呼び出されます。基本的に、System.gc()はメモリをクリーンアップし、finalize()を使用して個々のオブジェクトを削除します。

于 2012-04-17T06:29:40.197 に答える
0

System.gc()ガベージ コレクターは、任意のクラスでメソッドを呼び出すことによって呼び出されます。ただし、 jvm がシャットダウンする前に、無効化されたすべてのオブジェクトがガベージ コレクションされることは保証されません。したがって、基本的gc()な方法は、 new キーワードを使用して作成されたオブジェクトのみをガベージ コレクションすることです。オブジェクトは、ガベージ コレクタを呼び出す finalize()前にメソッドを明示的に呼び出すことによってガベージ コレクションが行われる以外のロジックによって作成されます。gc

于 2016-12-25T04:16:30.520 に答える