8

この(および他の)フォーラムで同じタイトルの質問をたくさん見ましたが、どれも私の問題に正確に対処しているようには見えませんでした。これがそれです:私はそれをホストするマシン上のすべてのCPUを消費するJVMを持っています。スロットルしたいのですが、このVmが実行される場所を想定できないため、Javaの外部にあるスロットルツール/テクニックに頼ることはできません。したがって、たとえば、VMがMacで実行されている場合、OSはプロセスアフィニティを利用できないため、プロセッサアフィニティを使用できません。

私が必要とするのは、スレッドがCPUをフルに使用しないようにするための手段がJava内に存在するかどうかを示すことです。

スレッドは継続的に値を生成する必要があるため、一部のフォーラムで提案されているように、プロセスの実行と一時停止を交互に行う手法を使用できないことをすぐに指摘したいと思います。

理想的には、たとえば、VMまたはスレッドの優先度を設定したり、CPUの消費割合に何らかの方法で上限を設定したりするための手段が必要です。

どんな助けでも大歓迎です。

4

5 に答える 5

6

私が必要とするのは、スレッドが完全な CPU を使用しないようにする手段が Java 内に存在するかどうかに関する指標です。

アプリケーションを調整して CPU の使用量を減らす以外に、Java 内でこれを行う方法を私が知っている方法はありません。

  • Thread.sleep(...);計算方法にいくつかの呼び出しを入れることができます。プロファイラーは、ホット ループ/メソッド/その他を表示するのに役立ちます。
  • 少数のスレッドをフォークすると、使用される CPU にも影響します。固定サイズのスレッド プールに移行するか、プール内のスレッド数を減らします。
  • 問題は CPU ではなく、他のリソースである可能性があります。たとえば、IO帯域幅に注意してください。ネットワークまたはディスクの読み取り/書き込みを遅くすると、サーバーが正常に動作するようになる場合があります。

JVM の外部から ~unixniceコマンドを使用して、実行中の JVM の優先度に影響を与え、システムを支配しないようにすることができます。これにより、使用可能な場合は CPU が割り当てられますが、他のアプリケーションがより多くの CPU を使用できるようになります。

于 2012-09-06T14:26:23.650 に答える
2

スレッドの優先度を設定するよりも信頼性の高いものが必要だと思いますか?

常に値を生成しているコードの実行を抑制したい場合は、スレッドが行う作業を分割し、独自のタイマーをコーディングする必要があります。たとえば、では、固定レートで実行java.util.Timerをスケジューリングできます。

他の手法は、スケジューラーが優先順位を付ける他のタスクを持っていない場合、利用可能な限り多くの CPU を消費します (同時実行を妨げるロックがないことを前提として、スレッドごとに 1 コア)。

于 2012-09-06T14:28:03.573 に答える
-1

Really interesting thread. I found out Java does not provide means for doing what I want to do, and the only way to do this is from outside the JVM. I ended up using nice to alter the scheduling priority in my test (Linux) environment, will still need to find something similar for WIn-based OSs.

Everyone's intervention has been much appreciated.

于 2012-09-07T20:10:52.900 に答える