あるインタビューで、「ガベージ コレクション スレッドのデフォルトの優先順位は何ですか?」という質問をされました。デフォルトの優先度については聞いたことがありませんが、GC を強制したり優先度を変更したりできないことは知っています。誰か知っていますか?
5 に答える
おそらく、インタビュアーが探していた答えは、GC が優先度の低いバックグラウンド プロセス上にあるということです。この理由は、GC の実行にはコストがかかるためですが、(通常) 重要なプロセスではないため、重要なタスクを中断するのではなく、システムが実行する時間がある場合にのみ実行する必要があります。(同様の考え方がリアルタイム システムにも存在します。重要でないプロセスをバックグラウンド タスクで実行し、すべての重要なプロセスをフォアグラウンドで実行します。これらはすべて、バックグラウンド タスクよりも優先度が高くなります。)
そうは言っても、ガベージ コレクションに関する Sun の文献を読むと、GC を優先度の低いスレッドとして実行するだけでは正しくありません。実際には、GC は単なるシングル スレッドではない場合があります。代わりに、メモリが少なくなると GC が実行されます (ただし、メモリが少なくなったときの判断は、おそらくバックグラウンド スレッドで行われます。他の誰かがこれを明確にすることができます)。
GC について読むための良いリンクを次に示します。
この質問に対する正しい答えは、「ガベージ コレクターのスレッドの優先度を気にする必要があると思われる場合は、おそらく何か間違ったことをしている」ということです。
スレッドの優先順位は、プロセスが取得する CPU 時間と必ずしも直接関係があるわけではないことに注意してください。これはシステムによって異なりますが、Windows では、スレッドの優先順位は基本的に、実行を待機しているスレッドが使用可能な CPU にスケジュールされる順序を決定するために使用されます。これにより、優先順位の高いスレッドが優先順位の低いスレッドを横取りできます。両方のスレッドが実際に CPU をめぐって競合していると仮定します。「優先度の低いCPUにCPU時間を少なくする」という実際のルールはありません。(Linux では、スレッドの優先度 (適切な値) と割り当てられた CPU 時間の間にもう少し直接的な関係があります。)
Windows でスレッドの優先順位がそのまま使用されている場合、ガベージ コレクターのようなバックグラウンド スレッドの場合、より適切な解決策は、おそらく逆説的に、高い優先順位を与えてから、他の手段 (本質的には、意図的に適切な時間の割合でスリープするか、適切な信号を待機します)。具体的には、高い優先度は、ほとんど何もする必要がないバックグラウンド スレッドに適していますが、何かをする必要がある場合はできるだけ早く実行する必要があります。
私は、特定のガベージ コレクション アルゴリズムによって、使用されているスレッドの優先順位を調べていません。しかし、私が言いたいのは、状況はいくぶん複雑であり、スレッドの優先度に基づいてガベージ コレクターの動作を仮定するのは奇妙に思えるということです。
スレッドの優先度にもっと興味がある人は、私が行ったスレッドの優先度の影響のいくつかの測定値を見たいと思うかもしれません.
更新:偶然にも、Cliff Click の講演が昨日 YouTube に投稿されました。約 35 分後、彼はまさにこの点に言及しています。特定の JIT スレッドと GC スレッドは、枯渇しないように高い優先度で実行する必要があるということです。
おそらく、質問はJVMの実際の実装を目指していたのでしょう。オンライン リファレンスで読むことができるように、ガベージ コレクターを実装する方法は複数あり、バージョンごとに異なる場合があります。そのため、GC の動作に依存するなと誰もが言います。別の JVM では動作が異なる場合があります。
優先度の低いスレッドです (正確な優先度についてはわかりません)。ここでのポイントは、GC が通常のスレッドを可能な限り遅くするのを避けることです。通常よりも優先度が低いと思います:)
少なくとも Java RTS では、必要に応じてガベージ コレクション スレッドの優先度を調整できます。優先順位の調整 (および一般的なスレッド スケジューリング) も、1 つだけの場合と複数の CPU ではかなり異なります。
現時点では、マルチ CPU 構成を前提としています。また、デフォルトのスケジューラーについてのみ話しているのですが、他のスケジューラーはまったく異なる方法で行うことができます。スレッドは基本的に、クリティカル優先度と非クリティカル優先度の 2 つのクラスに分類されます (どちらよりも高い「ヒープなしリアルタイム」スレッドを使用することもできますが、ヒープを使用しない/使用できないため、 GC との関連性はほとんどありません)。ガベージ コレクション スレッドは、通常、これらのいずれよりも低い優先度で実行されますが、必要に応じて、重要でないスレッドよりも高い優先度に引き上げることができます。ただし、GC スレッドの優先度は、重要なリアルタイム スレッドの優先度よりも常に低くなります。
「クリティカル」と「非クリティカル」の優先順位の境界線について、私は少しあいまいでした。それには理由があります。それは調整可能です。GC によってプリエンプトできるスレッドの優先度と、プリエンプトできないスレッドの優先度を選択できます。その意図は、重要なスレッドがハード リアルタイム レスポンスを取得し、重要でないスレッドがソフト リアルタイム レスポンスを取得することです。どのスレッドがどのカテゴリに分類されるかを決定/構成するのはあなた次第です。