# unable to create new native thread



## me.toString (21. Nov 2006)

Ich habe eine Anwendung, die in kürzester Zeit  über 20000 Datenpaare an den Kunden schicken muss. Dazu wird u.a. eine Bibliothek des Kunden verwendet, welche das rauschicken der Daten für mich übernimmt - und natürlich hab ich dafür keine sourcen ... kaum Doku ...
Wenn das Programm eine Weile gelaufen ist, bricht alles mit der Meldung: 
Exception in thread "Thread-63045" java.lang.OutOfMemoryError: unable to create new native thread
ab. Die Zahl variiert jedes mal. Die Meldug kommt meist dann, wenn ich einen Java-Thread starten will, der aber dann in der Fremdibliothek "verschwindet" .... also ich hab keine Ahnung viele Threads von der Bibo dann noch aufegemacht werden. Eins weiß ich aber noch von der Bibo ... sie nenutzt nativen Code, der als .so -Bibo im System liegt.
Die max. Thread-Anzahl des Systems (Linux) haben wir schon extrem hochgeschraubt ... daran kannes nicht mehr liegen. gibt es sowas für die JVM auch - also ein begrenzung wieviele Threads gleichzeit laufen dürfen??

ehli


----------



## Wildcard (21. Nov 2006)

Du bekommst eine OutOfMemoryException, d.h. der Heap der VM ist bei der von dir definierten Grenze angelangt.
Die maximale Größe des Heaps kannst du über den VM Parameter Xmx festlegen.


----------



## me.toString (21. Nov 2006)

Am Heap liegt's nicht. Den hab ich mit einem Profiler überprüft ... der steigt nicht über 64MB ... und ich habe ihm 1G gegeben.


----------



## Wildcard (21. Nov 2006)

Ist natürlich möglich das Java einen speziellen Speicherbereich für native Threads reserviert der gesondert festgelegt wird.
Da kann dir eventuell Google helfen.


----------



## Murray (21. Nov 2006)

Die Begrenzung könnte durch die für die einzelnen Threads reservierten Stacks gegeben sein; ich meine mich zu erinnern, dass Heap + (Anzahl der Threads * Thread-Stack-Size) einen gewissen Grenze (2GB?) nicht überschreiten dürfen. Demnach könnte man die Anzahl der maximal möglichen Threads erhöhen, indem man den Heap kleiner macht, oder aber - mit "-Xss"-Option - den einzelnen Threads kleinere Stacks zuweist.


----------



## me.toString (21. Nov 2006)

Das wäre auf jeden Fall einen Versuch wert.
Eben hab ich gelesen, dass jeder Thread auch einen einen "Stackfür native Methoden" besitzt - aber nirgends wird das Thema nährt beleuchtet ... weiß jemand von euch, ob man die Größe dieses Stacks beeinflussen kann ?


----------



## Murray (21. Nov 2006)

Diesen Effekt kann ich zumindest unter Windows erkennen. Folgendes Testprogramm:

```
public class MaxThreads {

	public MaxThreads( int numThreads) {
		
		for ( int i=0; i<numThreads; i++) {
			System.out.println( "#" + i);
			try {
				new Thread( new Runnable() {
					public synchronized void run() {
					
						try {
							wait();
						} catch ( Exception e) {
							e.printStackTrace();
						}
					}
				}, "Thread#" + i).start();
			} catch ( Throwable e) {
				System.out.println();
				System.out.println( "Could not create Thread #" + i + ": " + e);
				System.exit( 1);
			}
			
		}
		
		System.out.println( "done");
		System.exit( 0);
		
	}

	public static void main(String[] args) {
		new MaxThreads( 10000);

	}

}
```

java -Xss128K - Xms512M -Xmx512M MaxThreads -> OutOfMemory nach 5464 Threads
java -Xss256K - Xms512M -Xmx512M MaxThreads -> OutOfMemory nach 1397 Threads
java -Xss128K - Xms1024M -Xmx1024M MaxThreads -> OutOfMemory nach 3502Threads
java -Xss256K - Xms1024M -Xmx1024M MaxThreads -> OutOfMemory nach 885 Threads
java -Xss128K - Xms1536M -Xmx1536M MaxThreads -> OutOfMemory nach 1510 Threads
java -Xss256K - Xms1536M -Xmx1536M MaxThreads -> OutOfMemory nach 377 Threads


Man sieht also: 
 1. je besser man es mit dem Heap meint, desto weniger Threads sind möglich.
 2. durch Reduzieren des Thread-Stacks kann man mehr Threads erzeugen


----------

