2009-09-29 7 views
12

Javaでスレッドを使用する場合の「コスト」はいくらですか?親指/経験値のルール、スレッドの作成にかかるメモリ量はどれくらいですか?スレッドを作成するのに必要なCPUサイクルの数は、おおよその見積もりですか?スレッドのCPUサイクルとメモリの大まかな「コスト」はいくらですか?

コンテキスト:Webアプリケーションのサーブレットでは、コンテンツの一部をファイルベース、データベースベース、およびWebサービスベースとして並列化したいと考えています。しかしこれは、(私のserlvetコンテナの)すべての "http-request-thread"に対して、2〜4つの追加のスレッドを持つことを意味します。 Java 12でExecutorServiceを使用することに注意してください。

Webサーバー上で数百から数千のJavaスレッドを使用する場合、私は何を期待していますか?

答えて

13

各スレッドには独自のスタックがあり、メモリに直接影響します。デフォルトのスレッド・スタック・サイズは、Java 6、512kの場合はIIRCです(異なるJVM /バージョンではデフォルト値が異なる可能性があります)。この数字は-Xssオプションを使用して調整できます。その結果、何百ものスレッドを使用すると、VMが消費するメモリに影響を与えます。

明らかなリンクではないため、クライアントはスレッド/メモリに関連する問題に遭遇しています。 100,000スレッド(エグゼキュータ/プールなどを使用して)を作成することは自明であり、メモリの問題はすぐにこれに起因するとは思われません。

多くのクライアントにサービスを提供している場合は、Java NIO API、特にmultiplexingを参照すると、非同期ネットワークプログラミングが可能になります。これにより、1つのスレッドだけで多くのクライアントを処理できるようになり、その結果、膨大な数のスレッドが必要になることが少なくなります。

1

これは、OS、Javaのバージョン、CPUによって異なります。これを理解する唯一の方法は、それを試して結果を測定することです。

ExecutorServiceを使用しているので、スレッド数を簡単に制御できます。あまり使用しないでください。要求が積み重なってしまいます。あまりにも多くを使用すると、Javaがスレッドを使い切るずっと前に、ファイルシステムとDBでパフォーマンス上の問題が発生します。

関連する問題