8 つのコア (4 つの物理、4 つの HT) を持つ Core i7 ラップトップで Java プログラムを実行しています。プログラムは 8 つの並列スレッドを使用するため、すべての CPU を使用する必要があります。「-server」パラメーターを指定して実行すると、常に 100% になります。それがなければ、全体で約 50% から 60% です (常に 100% のピークと 30% のディップで変化します)。私が奇妙なことに気付いたのは次のとおりです。プログラムをデバッグで実行し、CPU 使用率が特に低い (30%) まで待ってから、実行を一時停止して 8 つのスレッドが何をしているかを調べたところ、ブロック状態になっているスレッドはありませんでした。 . さらに、それらの間の同期はほとんどありません。これが私が疑問に思っていることです:
- CPU がクライアントで 100% に達するのを妨げるサーバー VM とクライアント VM の違いは何ですか?
- 同期がない場合、スレッドがコアを完全に使い果たすのを妨げているのは何でしょうか? (おそらく1にリンクされています)
編集: ここに考えがあります: コードは大きな配列を割り当て、GC にかなり迅速に任せます。「newSomethingBig()」を呼び出してそのメモリの割り当てに時間がかかると、スレッドはスリープしますか? VM に一連のスレッドの割り当てを処理する単一のプロセスがある場合、同期ブロックの外でランダムに一時停止しているように見える理由を説明できると思います...
Edit2:GCが原因であると確信しています。VM にデフォルトの 500Mb の代わりに 1500Mb を与えると、CPU は再び 100% に達します。デフォルトでより多くのメモリを使用するため、サーバーモードではスローダウンは発生しないと思います。