System.gc() を呼び出すのはなぜ悪い習慣なのでしょうか? 質問する

System.gc() を呼び出すのはなぜ悪い習慣なのでしょうか? 質問する

答える方法についての質問Java のフォースフリーオブジェクト(その人は 1.5GB の HashMap をクリアしていました) でSystem.gc()、手動で呼び出すのは悪い習慣だと教えられましたSystem.gc()が、コメントは完全に説得力のあるものではありませんでした。さらに、誰も私の回答に賛成票を投じたり、反対票を投じたりする勇気がないようでした。

そこでは、それは悪い習慣だと言われましたが、その後、ガベージ コレクターの実行によって世界が体系的に停止することはなくなり、JVM によってヒントとしてのみ効果的に使用される可能性もあるとも言われたので、私は少し困惑しています。

JVM は、メモリを再利用する必要がある場合、通常はあなたよりもよく知っていることは理解しています。また、数キロバイトのデータを心配するのは愚かなことだということも理解しています。また、数メガバイトのデータでさえ、数年前ほどではないことも理解しています。しかし、それでも 1.5​​ ギガバイトですか?メモリ内に 1.5 GB ほどのデータが残っていることはご存知でしょう。闇雲にやっているわけではありません。System.gc()体系的に悪いのでしょうか、それとも、問題がなくなるポイントがあるのでしょうか?

つまり、質問は実際には二重です。

  • を呼び出すのはなぜ悪い習慣なのか、あるいはそうではないのかSystem.gc()?特定の実装では、これは単にJVMへのヒントにすぎないのか、それとも常に完全なコレクションサイクルなのか?世界を停止せずに作業を実行できるガベージコレクタの実装は本当に存在するのか?私のコメントで人々が行ったさまざまな主張について、少し説明してください。答え
  • 基準はどこにあるのでしょうか?電話をかけるのは決して良い考えではないSystem.gc()のでしょうか、それともそれが許容される場合もあるのでしょうか? もしそうなら、それはいつでしょうか?

ベストアンサー1

誰もが常に避けるように言う理由は、それが根本的に壊れたコードを示すかなり良い指標System.gc()だからです。正確さのためにそれに依存するコードは確実に壊れており、パフォーマンスのためにそれに依存するコードは壊れている可能性が高いです。

どのような種類のガベージ コレクターを実行しているかはわかりません。確かに、あなたが主張するように「世界を停止」しないものもありますが、一部の JVM はそれほどスマートではないか、さまざまな理由 (おそらく電話機上にあるため) でそれを実行しません。それが何を行うかはわかりません。

また、何かが行われることは保証されていません。JVM がリクエストを完全に無視する可能性もあります。

「それが何をするのか分からない」、「それが役に立つかどうか分からない」、「とにかく呼び出す必要はない」という理由から、人々は一般的に呼び出すべきではないと強く主張しています。これは「これを使うべきかどうか尋ねる必要があるなら、呼び出すべきではない」というケースだと思います。


他のスレッドからのいくつかの懸念に対処するために編集します:

リンク先のスレッドを読んで、さらにいくつか指摘したいことがあります。まず、呼び出しによってgc()システムにメモリが返される可能性があると示唆する人がいました。これは必ずしも真実ではありません。Java ヒープ自体は Java 割り当てとは無関係に増加します。

つまり、JVM はメモリ (数十メガバイト) を保持し、必要に応じてヒープ サイズを拡大します。Java オブジェクトを解放しても、必ずしもそのメモリをシステムに返すわけではありません。割り当てられたメモリを保持して、将来の Java 割り当てに使用することは完全に自由です。

何もしない可能性があることを示すにはSystem.gc()JDK バグ 6668279特に、-XX:DisableExplicitGCVMオプション:

デフォルトでは、 の呼び出しはSystem.gc()有効になっています ( -XX:-DisableExplicitGC)。-XX:+DisableExplicitGCの呼び出しを無効にするには、 を使用しますSystem.gc()。JVM は必要に応じてガベージ コレクションを実行することに注意してください。

おすすめ記事