これは非常に面倒な質問であり、言語がいかに有用であるにも関わらず、Javaに反対する多くの人に貢献していると感じています。
「System.gc」が何かを実行することを信頼できないという事実は非常に困難であり、「恐怖、不確実性、疑い」の感覚を言語に簡単に呼び出すことができます。
多くの場合、重要なイベントが発生する前に故意に引き起こしたメモリスパイクに対処すると、ユーザーがプログラムの設計が不適切で応答がないと考えるようになります。
ガベージコレクションを制御する機能は非常に優れた教育ツールとなり、ガベージコレクションのしくみとプログラムがデフォルトの動作と制御された動作をどのように利用するかを人々に理解を深めることができます。
このスレッドの引数を確認しましょう。
- それは非効率的です:
多くの場合、プログラムは何も実行していない可能性があり、プログラムの設計方法が原因で何も実行していないことがわかります。例えば、それは大きな待機メッセージボックスである種の長い待機を行っているかもしれません、そしてそれを実行する時間は本当に時間のほんのわずかな時間しかかからないので、最後にそれはガベージを収集するための呼び出しを追加するかもしれません。長時間待機しますが、より重要な操作の途中でgcが機能しなくなります。
- これは常に悪い習慣であり、コードが壊れていることを示しています。
私は同意しません、あなたがどんなガベージコレクタを持っているかは問題ではありません。その仕事はゴミを追跡し、それをきれいにすることです。
使用がそれほど重要ではない時間帯にgcを呼び出すことにより、実行中の特定のコードに依存しているが、ガベージを収集することを決定した場合に、実行される確率を減らすことができます。
もちろん、期待どおりまたは期待どおりに動作しない場合がありますが、呼び出したい場合は、何も起こっていないことがわかり、ユーザーは遅延やダウンタイムを許容します。System.gcが機能すれば、すばらしいです。そうでない場合、少なくともあなたは試しました。ガベージコレクターに、ガベージコレクターが手動で呼び出された場合の動作を想定した場合に予期せぬ事態を招くような固有の副作用がない限り、不都合な点はありません。
- これは一般的なユースケースではありません:
これは確実に達成できないユースケースですが、システムがそのように設計されている場合はそうなる可能性があります。それは信号機を作り、信号機のボタンの一部/すべてが何もしないようにすることのようなものです、それはなぜボタンがそもそもそこにあるのか疑問に思います、JavaScriptはガベージコレクション機能を持っていないので私たちはしませんあまり精査しないでください。
- 仕様によると、System.gc()はGCを実行するためのヒントであり、VMはそれを自由に無視できます。
「ヒント」とは何ですか?「無視」とは何ですか?コンピュータは単にヒントを受け取ったり、何かを無視したりすることはできません。システムの意図によって導かれる、動的である可能性のある厳密な動作パスがあります。適切な答えには、ガベージコレクターが実装レベルで実際に何をしているかが含まれます。これにより、要求時にコレクションが実行されなくなります。機能は単にnopですか?満たさなければならない条件はありますか?これらの条件は何ですか?
現状では、JavaのGCは、あなたが信用していないモンスターのように見えることがよくあります。あなたはそれがいつ来るのか、いつ行くのか、あなたはそれが何をするのか、どうやってそれをするのかを知りません。ガベージコレクションが命令ごとにどのように機能するかについてより良いアイデアを持っている一部の専門家を想像できますが、大多数は単に「正しく機能する」ことを望んでおり、不透明に見えるアルゴリズムを信頼して仕事をするのはイライラさせられます。
何かについて読んだり、教えられたりすることと、実際にその実装を確認すること、システム全体の違いを理解すること、そしてソースコードを見なくてもそれを試すことができることの間には大きなギャップがあります。これは自信と習得/理解/コントロールの感覚を生み出します。
要約すると、答えには固有の問題があります。「この機能は何も実行しない可能性があります。また、実行するタイミングと実行しないタイミング、および実行しない、または実行しない理由を詳細に説明することはしません。それをしようとすることは、その背後にある意図が合理的であるとしても、単にそれをしようとする哲学に反していることをしばしば意味します。」
Java GCがそのように動作することは問題ないかもしれませんが、そうでない場合もありますが、それを理解するために、GCが信頼できることの包括的な概要を取得するためにどの方向に進むかを正確に追跡することは困難です。そうしないと、言語の目的が哲学的な範囲まで行動を制御することであるので、言語を単純に信用するのは簡単です(プログラマー、特に初心者が特定のシステム/言語の行動から実存的危機に陥るのは簡単です)。許容する能力があり(できない場合は、必要になるまでその言語を使用しません)、それらを制御できない既知の理由がないために制御できないものは本質的に有害です。