0

最終ブロックでインスタンスを Orphan として作成すると、GC がガベージ コレクションを優先的に実行するように要求されますか?

SQLConnect ds =null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
...  
variables  

try {
    //Business Logic       
} catch(Exception e) {
    //Logging goes here
} finally {
    //Make instances Orphan
    ds = null;
    con = null;
    pstmt = null;
    rs = null;
}
4

5 に答える 5

5

最終ブロックでインスタンスをオーファンとして作成すると、GC がガベージ コレクションを優先的に実行するように要求されますか?

いいえ。代入nullは、オブジェクトがガベージ コレクションされる「優先度」を変更しません。実際、これらの変数のスコープがもうすぐ終了すると仮定すると、変数への代入nullは無意味になります。

( nullJava の一部の変数またはフィールドに代入しても、参照カウントなどは減少せず、対応するオブジェクトの再利用もトリガーされません。実際、完全な GC は代入イベントを無視します。代入でできることのほとんどは、しかし、この例では、変数がスコープ外に出ようとしているところですが、いずれにせよ、これはほとんどすぐに起こります。したがって、null代入は何も達成しません。)

ガベージ コレクションは、ユーザーの操作に関係なく、適切なタイミングであると JVM が判断したときに実行されます。呼び出しは別として...これは他の理由からSystem.gc()本当に悪い考えです!


通常の状況では、GC がいつ実行されるかを気にする必要はありません。ただし、この場合、外部リソースを扱っています。つまり、データベース接続、結果セットなどです。これらは適切に「管理」する必要があります。そうしないと、リソースリークの問題が発生する可能性があります。

オブジェクトがGCされた場合、それらはおそらくそれぞれのfinalizeメソッドによって閉じられます。ただし、リソース リークの悪影響を回避するには、ファイナライズが遅すぎる可能性があります。

したがって、これらを管理する正しい方法はnull、より早く GC されることを (無駄に) 希望することではありません。それらに対処する正しい方法は、ブロック内でそれぞれclose()のメソッドを明示的に呼び出すことです。finally例えば

finally {
    conn.close();  // This should also close any child Statement and 
                   // ResultSet instances
}

これを行うためのより良い方法は、Jon Skeet's answer で説明されているように、Java 7 の「try with resource」構文を使用することです。

于 2013-06-28T06:22:32.640 に答える
1

ガベージコレクターを台無しにしないでください。これにより、コードが理解しにくくなり、パフォーマンスが向上しないことがよくあります。

オブジェクトへの参照が少なくとも 1 つある限り、何をしてもガベージ コレクターはオブジェクトを収集しません。

オブジェクトへの参照がなくなると、ガベージ コレクターがオブジェクトを収集します。ガベージ コレクタは、メモリが少なくなると実行されます。

Connection一部のオブジェクト(あなたの場合のように)も外部リソースを取得することに注意してください。このリソースは、毎回手動で解放する必要があります。Connectionしたがって、 に設定するよりも、finallyブロック内のを閉じる方がはるかに重要nullです。

于 2013-06-28T06:18:41.847 に答える
0

いいえ、絶対にありません。千回いいえ。

Java はメモリ管理言語です。通常のメモリ管理方法とは異なる方法でメモリを管理するように JVM に強制しようとしても、何の得にもなりません。このようなスキームは必然的に JVM 実装に依存し、移植性がなく、修正されるよりも多くの問題を引き起こす可能性があります。

Java でメモリ リークを回避する最善の方法は次のとおりです。

  • オブジェクト参照を可能な限り狭い範囲に制限します。多くの場合、オブジェクトの参照のスコープを単一のメソッドまたはブロックに制限します。参照が範囲外になるとすぐに、ガベージ コレクションの対象になります。

  • マネージド メモリの独自の実装を表す参照型に対してのみ、オブジェクト参照を null にします。『Effective Java, 2nd Ed.』では、Joshua Bloch が参照の単純なキャッシュの例を示しています。キャッシュが縮小したら、使用されなくなった参照を無効にすることを彼は推奨しています (そうしないと保持され、それぞれのオブジェクトがコレクションの対象にならなくなります)。彼はこれを「自分で管理するために選択した記憶」と呼んでいます。

  • 有効期間が長い変数がこれらの参照を保持できるコンテキストに、そうでなければ有効期間が短いオブジェクトの参照を「漏らす」ことは避けてください。内部クラスは、これが発生する状況を表します。

  • リソースを大量に消費する、存続期間の長いオブジェクトのためにリソースを解放します。例としては、データベース接続と特定の GUI コントロールがあります。

参照型を可能な限り狭い範囲に制限している限り、ほとんどの場合、ガベージ コレクションについて心配する必要はありません。

于 2013-07-14T00:50:01.377 に答える