2012-05-08 7 views
7

私は現在、Scalaの俳優について学んでいます。本書では、receiveの代わりにreactメソッドを使用することを推奨しています。これは、システムでスレッドを少なくすることができるためです。JVMアプリケーションに多数のスレッドが高価ですか?

私はwhy creating a thread is expensiveを読みました。しかし、いったんスレッド(初期化後にScalaのアクターシステムのために保持する必要がある)を持っていたら、それらを持つことはコストがかかるのですか?

主にメモリ消費ですか?それとも他の理由がありますか?

+0

この質問は、作成後のスレッド*のオーバーヘッドに関するものであるため、リンクされた質問の複製ではありません。実際にはすでに質問に記載されています... – rolve

答えて

10

理由:

  • 各スレッドがJVM用にまったく作成することができますどのように多くのスレッド上の制限を課すヒープの外のメモリを消費します。
  • あるスレッドから別のスレッドへの切り替えは、CPU時間を消費します。したがって、単一のスレッドで実行できるアクティビティがある場合は、CPUサイクルを節約します。
  • さらにスレッドがあれば、もっと多くの作業が必要なJVMスケジューラがあります。基礎となるOSスケジューラにも同じです。
  • 最後に、CPUバインドされたタスクにCPUコアを使用するより多くのスレッドを使用することはほとんど意味がなく、I/Oアクティビティ(ネットワーククライアントなど)より多くのI/Oスレッドを使用することはほとんど意味がありません。
+4

"JVMスケジューラ"コメントは、GCの一時停止が多少増加することを意味する(ただし、すべてのスレッドをセーフポイントにするのに時間がかかる)若い世代のポーズで – Matt

+0

@マットその素晴らしい点!ありがとうございました! –

2

周りにスレッドがある(小さいかもしれない)かもしれないというメモリのオーバーヘッドに加えて、周りにスレッドをたくさん持っていると、スケジュールがどんなスレッド次にCPUを取得します。

一部のオペレーティングシステム/ JVMには、同時に存在するスレッドの量に制約がある場合があります。

最終的には、小さなオーバーヘッドが蓄積され、最終的に多くのことを説明することができます。そして、これはJavaに固有のものではありません。あなたが予想よりより高価であり、多くのスレッドを使用して

2

周囲にスレッドがあることは「高価」ではありません。もちろん、それはちょっと私たちがここで何を話しているかによって決まります。私は数十億のスレッドが問題になると思うだろう。私は一般的に言って、多くのスレッドを持っていると思うのは、CPUが上がったり、メモリが上がったりするなど、より多くの並列処理を行うことができるからです。しかし、それらが正しく管理されていれば(例えばシステムリソースを保護するためにプール)大丈夫です。 JVMは必ずしもネイティブスレッドを使用するわけではないので、Javaスレッドは必ずOSネイティブスレッドにマッピングされる必要はありません(たとえば、緑色のスレッドや軽量のスレッドを参照)。私の意見では、JVMのスレッドに暗黙のコストはありません。コストは、スレッドの管理が貧弱で、リソースを過度に使いすぎてしまったために発生します。

+1

それは今のところ最善の説明だから+1です。 –

+0

確かに "高価な"です。それはメモリを使用します。私は64ビットマシンでは、デフォルトは1MB /スレッドと信じています。だから1000スレッド=> 1ギガバイト。あなたは32GBを持っていて気にしないかもしれませんが、 "高価ではない"というのは誤解を招きます。 –

関連する問題