質問

私は現在Javaに取り組もうとしているC ++プログラマーです。 C ++に取り組むには、動的なメモリの割り当てを追跡し、RAIIのようなさまざまな手法を採用してメモリリークを避ける習慣があります。私たちが知っているJavaは、メモリリークの世話をするためのゴミコレクター(GC)を提供します。 GCなしで言語をプログラミングするときに同様のアプローチを持っていると、割り当てたメモリの世話をして、GCに見逃してしまうかもしれないものの世話をさせてください。アプローチは何ですか?どちらの欠点もありますか?

役に立ちましたか?

解決

GCの存在下で割り当てる記憶の世話をしようとすることの意味はわかりませんが、読書をしてみます。

基本的に、記憶が収集されることを「心配」してはいけません。もはやオブジェクトを参照しないと、それらは拾われます。オブジェクトが残りのプログラムに参照される状況を作成すると、論理メモリリークがまだ可能です(例:リスナーを登録し、それらを登録しないことを実行します、例:アイテムを設定しないベクターのようなコレクションの実装 null 端からアイテムを削除するとき)。

ただし、RAIIの背景が強い場合は、Javaに直接同等のものがないことを知るには困難になります。 GCは、メモリを処理するためのファーストクラスのツールですが、最終的なパイナライザーがいつ(または場合でさえ)保証されていません。これは、記憶に適用される一流の治療が いいえ Windows、データベース接続、ソケット、ファイル、同期プリミティブなど、その他のリソースに適用されます。

他のヒント

Javaと.net(そして、他のほとんどのGC'ed言語)を使用すると、ヒープメモリについてあまり心配する必要はありません。あなたは何 行う 心配する必要があります。ファイルハンドル、ソケット、フォントなどのGUIプリミティブなどのネイティブリソースです。これらは一般に「処分」する必要があり、ネイティブリソースをリリースします。 (彼らはとにかくファイナライゼーションで自分自身を処分することがよくありますが、それに頼るのはちょっと不明瞭です。自分で物を処分します。)

GCを使用すると、次のことが必要です。

  • ファイルハンドルやDB接続などの非メモリリソースを適切にリリースするように注意してください。
  • もう必要ないオブジェクトへの参照を保持しないようにしてください(コレクションに保管するなど)。そうすれば、メモリリークがあるからです。

それとは別に、あなた できません 本当に「あなたが割り当てる記憶の世話をする」ことであり、そうしようとすることは時間の無駄になるでしょう。

技術的には、すべてのオブジェクトが適切にカウントされ、GCがすべての世話をするため、メモリの割り当て後のクリーンアップを心配する必要はありません。実際には、過活動GCはパフォーマンスに悪影響を及ぼします。したがって、Javaにはありませんが delete オペレーター、可能な限りオブジェクトを再利用するのに適しています。

また、GCがそれらに到達するまでオブジェクトが存在するため、Javaには破壊者がありません。したがって、Javaには finally すべての非メモリ関連のリソース(ファイルソケットなど)がそれらを使用したときに閉じていることを確認するために使用する必要があるコンストラクト。に依存しないでください finalise あなたのためにこれを行う方法。

Javaでは、GCはメモリの割り当てと未使用のメモリの解放に対応します。これは、問題を完全に無視できるという意味ではありません。

Java GCは、ルートから参照されていないオブジェクトを解放します。これは、グローバルハッシュマップなどのキャッシュなどのグローバルコンテキストから参照を削除するように注意しない場合、Javaがメモリリークを持つことができることを意味します。

お互いを参照するオブジェクトのクラスターがルートから参照されない場合、Java GCはそれらを解放します。つまり、参照カウントでは動作しないので、する必要はありません null すべてのオブジェクト参照(一部のコーディングスタイルは、もはや必要ではないため、sonnとしてクリアリファレンスを好みます。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top