ページ更新: 2007-03-06 (火) (4396日前)

関連: Java/JNI/スタック設定

(2007-03-06 新規作成)

スレッドが何個作れるか試してみた。

とりあえず、Windows XP Professional SP2で。

[編集]

メモ #

  • -Xmx でJVMに与えるメモリを増加させると、スレッド個数の上限が減少する
    • スレッドごとのスタック (Javaのと、nativeのと) が占めるメモリが原因?
      • 「-Xss<size> set java thread stack size」や
      • Thread(ThreadGroup group, Runnable target, String name, long stackSize) も使えそう
    • Thread#activeCount() も併用すること。(たぶんmainとガーベッジコレクタの分で+2になる)
[編集]

ソースコード #

[編集]

Javaソースコード #

起動したらsleepするスレッドをひたすら作って数える。

public class CheckThreadLimit {
    public static void main(final String[] args) {
        System.out.println("java.version=" + System.getProperty("java.version"));
        System.out.println("java.vm.version=" + System.getProperty("java.vm.version"));
        System.out.println("java.vm.name=" + System.getProperty("java.vm.name"));
        System.out.println("memory=" + Runtime.getRuntime().totalMemory() / 1024 / 1024);

        int i = 0;
        try {
            for (;i < Integer.MAX_VALUE; i++) {
                final Thread t = new Thread() {
                    public void run() {
                        try {
                            Thread.sleep(Long.MAX_VALUE);
                        } catch (final InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
                t.setDaemon(true);
                t.start();
            }
        } catch (final OutOfMemoryError e) {
            System.out.println("count=" + i);
//          System.out.println("activeCount=" + Thread.activeCount());
            e.printStackTrace(System.out);
        }
    }
}
[編集]

コンパイル手順 #

javac -source 1.4 -target 1.4 CheckThreadLimit.java
[編集]

実行用バッチファイル #

実行用バッチファイル (注意: Javaは全てJDK,SDKを使用、C:\Java 以下にインストールしてある) :

C:\java\j2sdk1.4.2_12\bin\java  -client -Xms512m -Xmx512m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java  -client -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.5.0_10\bin\java    -client -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -client -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java       -client -Xms512m -Xmx512m  CheckThreadLimit

C:\java\j2sdk1.4.2_12\bin\java  -server -Xms512m -Xmx512m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java  -server -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.5.0_10\bin\java    -server -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -server -Xms512m -Xmx512m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java       -server -Xms512m -Xmx512m  CheckThreadLimit

C:\java\j2sdk1.4.2_13\bin\java    -server -Xms32m -Xmx32m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java    -server -Xms64m -Xmx64m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java    -server -Xms128m -Xmx128m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java    -server -Xms256m -Xmx256m  CheckThreadLimit
C:\java\j2sdk1.4.2_13\bin\java    -server -Xms512m -Xmx512m  CheckThreadLimit

C:\java\jdk1.5.0_11\bin\java    -server -Xms32m -Xmx32m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -server -Xms64m -Xmx64m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -server -Xms128m -Xmx128m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -server -Xms256m -Xmx256m  CheckThreadLimit
C:\java\jdk1.5.0_11\bin\java    -server -Xms512m -Xmx512m  CheckThreadLimit

C:\java\jdk1.6.0\bin\java    -server -Xms32m -Xmx32m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java    -server -Xms64m -Xmx64m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java    -server -Xms128m -Xmx128m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java    -server -Xms256m -Xmx256m  CheckThreadLimit
C:\java\jdk1.6.0\bin\java    -server -Xms512m -Xmx512m  CheckThreadLimit
[編集]

結果を集計するPythonスクリプト #

#!c:\Python24\python.exe
# -*- coding: iso-8859-1 -*-

import sys
import re

"""
JVM thread limit summary

"""

## get input file name

file = ''
if len(sys.argv) == 2:
    file = sys.argv[1]
else:
    print "usage: %s file" % sys.argv[0]
    sys.exit(1)

## read data file, store records.

records = []
record = {}

inFile = open(file, 'r')
for line in inFile:
    line = line.rstrip('\n').rstrip('\r')
    if re.match('^[a-z.]+=', line) == None: continue

    t = line.split("=")
    if len(t) != 2: continue

    record[t[0]] = t[1]

    if line.find("count") == 0:
        records.append(record)
        record = {}
inFile.close()

## print result...

format = "%-10s\t%-30s\t%-4s\t%-6s"
print format % ("java.version", "java.vm.name", "memory", "count")
for r in records:
    print format % (r["java.version"], r["java.vm.name"], r["memory"], r["count"])

## end
[編集]

結果 #

[編集]

CheckThreadLimitの表示例 #

C:> C:\java\j2sdk1.4.2_13\bin\java  -client -Xms512m -Xmx512m  CheckThreadLimit 
java.version=1.4.2_13
java.vm.version=1.4.2_13-b06
java.vm.name=Java HotSpot(TM) Client VM
memory=508
count=5458
java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start(Native Method)
	at CheckThreadLimit.main(CheckThreadLimit.java:21)

C:> C:\java\jdk1.5.0_11\bin\java    -client -Xms512m -Xmx512m  CheckThreadLimit 
java.version=1.5.0_11
java.vm.version=1.5.0_11-b03
java.vm.name=Java HotSpot(TM) Client VM
memory=508
count=5345
java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method)
	at java.lang.Thread.start(Thread.java:574)
	at CheckThreadLimit.main(CheckThreadLimit.java:21)

C:> C:\java\jdk1.6.0\bin\java       -client -Xms512m -Xmx512m  CheckThreadLimit 
java.version=1.6.0
java.vm.version=1.6.0-b105
java.vm.name=Java HotSpot(TM) Client VM
memory=508
count=4278
java.lang.OutOfMemoryError: unable to create new native thread
	at java.lang.Thread.start0(Native Method)
	at java.lang.Thread.start(Thread.java:597)
	at CheckThreadLimit.main(CheckThreadLimit.java:21)
[編集]

集計 #

java.version	java.vm.name                  	memory	count 
1.4.2_13  	Java HotSpot(TM) Client VM    	508 	5458  
1.5.0_11  	Java HotSpot(TM) Client VM    	508 	5345  
1.6.0     	Java HotSpot(TM) Client VM    	508 	4278  
1.4.2_13  	Java HotSpot(TM) Server VM    	506 	5388  
1.5.0_11  	Java HotSpot(TM) Server VM    	504 	5381  
1.6.0     	Java HotSpot(TM) Server VM    	504 	4309  
1.4.2_13  	Java HotSpot(TM) Server VM    	31  	7286  
1.4.2_13  	Java HotSpot(TM) Server VM    	63  	7160  
1.4.2_13  	Java HotSpot(TM) Server VM    	126 	6906  
1.4.2_13  	Java HotSpot(TM) Server VM    	253 	6400  
1.4.2_13  	Java HotSpot(TM) Server VM    	506 	5387  
1.5.0_11  	Java HotSpot(TM) Server VM    	31  	7278  
1.5.0_11  	Java HotSpot(TM) Server VM    	63  	7152  
1.5.0_11  	Java HotSpot(TM) Server VM    	126 	6899  
1.5.0_11  	Java HotSpot(TM) Server VM    	252 	6392  
1.5.0_11  	Java HotSpot(TM) Server VM    	504 	5381  
1.6.0     	Java HotSpot(TM) Server VM    	31  	5833  
1.6.0     	Java HotSpot(TM) Server VM    	63  	5731  
1.6.0     	Java HotSpot(TM) Server VM    	126 	5528  
1.6.0     	Java HotSpot(TM) Server VM    	252 	5121  
1.6.0     	Java HotSpot(TM) Server VM    	504 	4309