[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12533] Re: Java Concurrency In Practice 第 4 回議 事録



高橋(徹)です。

> 6.1.3 Disadvantages of unbounded thread creation
> 
> OSの設定で、スレッド数上限の規定あり
> (プロセスあたりのスレッド数)
> 
> Linux 2.4だと、スレッド数はID上限で8192に壁あり

OS毎に生成できる最大スレッド数の設定があるかと思いますが、
現在見つけることが出来ていません。

> 宿題)各自自分のマシンで最大スレッド数を調べてみよう

スレッドを同時にいくつ起動できるか、実験コードで試してみました。
(実験コードは添付ファイルにしています)

(1) Windows XP      Sun JDK 5.0 Update9 最大7117スレッド
(2) Solaris 10 x86  Sun JDK 5.0 Update7  最大11200スレッド
(3) CentOS 4.4      Sun JDK 5.0 Update9  最大5527スレッド

いずれもスレッド数を超過すると次のエラーが発生しました。
OutOfMemoryError: unable to create new native thread

JVMのメモリ関連パラメータとして、-Xmx, -Xssを変更してみたものの
いじれば最大スレッド数がかえって低下したので、各OSでのデフォルト
設定のまま実行しています。

Solaris OSが予想通り群を抜いて最大スレッド数の許容量が多い
ようです。

(2) Solaris 10でのスレッド数と使用メモリ(SIZE:仮想、RSS:物理)
     9000  10000  11000 11200
SIZE 236M   256M   256M  262M
RSS  164M   183M   183M  189M

(3)CentOS4.4でのスレッド数と使用メモリ(VIRT:仮想、RES:物理)
     1024   2048   4096   5120  5527
VIRT 777m  1297m  2337m  2856m 3063m
RES   53m    53m    87m   104m  127m


--
TAKAHASHI,Toru
torutk@xxxxxxxxxxxx

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;

public class UnboundThreadCreator3 {

    public static final void main(final String[] args) {
        int numThreads = Integer.parseInt(args[0]);
        System.out.println("Number of Thread = " + numThreads);

        final CyclicBarrier barrier = new CyclicBarrier(numThreads);

        for (int i=0; i<numThreads; i++) {
            Thread thread = new Thread(new Runnable() {
                    public void run() {
                        int count = 10;
                        while (count > 0) {
                            try {
                                count--;
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                break;
                            }
                        }
                        try {
                            barrier.await();
                        } catch (InterruptedException e) {
                            System.err.println("Interrupted when awaiting");
                        } catch (BrokenBarrierException e) {
                            System.err.println("Broken barrier when awaiting");
                        }
                    }
                }
            );
            thread.start();
        }
    }
}