Ich habe eine CORBA Anwendung geschrieben. Alles funktioniert soweit ganz
gut, aber nach einiger Zeit bekomme ich die Meldung:
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start(Native Method)
at
com.sun.corba.se.internal.iiop.IIOPConnection.setConnection(IIOPConnection.j
ava:850)
...
Für jede CORBA Anfrage erstelle ich eine Instanz einer Klasse, die Thread
extends. Dies wird gestartet und am ende läuft sie aus. Das ist der Ort an
dem ORB.init(...) steht. Aber wenn der Thread beendet ist, verschwindet er
doch aus dem Speicher, oder? Woran kann das denn noch liegen?
Vielen vielen Dank
JEns
Ich habe mir alle Prozesse anzeigen lasse (mit top). Es sind 85 Prozesse, 84
sleeping. Wenn ich das Programm starte sind es 98 und 97 sleeping. Das hält
sich ja noch in Grenzen. Aber sobald ich die erste Berechnung ablaufen lasse
sind es am ende der ersten Berechnung genau 291 und 290 sleeping. Das deutet
doch darauf hin, daß die Threads nicht beendet haben, oder kann das an
irgendeiner ORB Geschichte liegen?
Vielen Dank
Jens
"Jens Kluesener" <j.klu...@web.de> schrieb im Newsbeitrag
news:ac5q7t$mhh5f$1...@ID-96717.news.dfncis.de...
IMHO ist das eine ziemlich teure Lösung für jeden remote request
einen neune Thread zu erzeugen und in diesem auch noch ORB.init aufzurufen.
Zumindest die ORB-Initialisierung sollte nur einmal erfolgen.
Ansonsten ist ws. comp.lang.java.corba bzw. cop.object.corba eine beserer
Ort für derartige Fragen.
Gruß
Manfred
"Jens Kluesener" <j.klu...@web.de> schrieb im Newsbeitrag
news:ac5sub$mtqar$1...@ID-96717.news.dfncis.de...
"Manfred Reinart" <m...@ooc.de> schrieb im Newsbeitrag
news:ac7pt0$nakso$1...@ID-31703.news.dfncis.de...
> Hi Jens,
>
> IMHO ist das eine ziemlich teure Lösung für jeden remote request
> einen neune Thread zu erzeugen und in diesem auch noch ORB.init
aufzurufen.
>
> Zumindest die ORB-Initialisierung sollte nur einmal erfolgen.
>
Wie kann ich denn den durch die Initialisierung verbebenen Speicherplatz
wieder freigeben, bezogen auf die ganze ORB Geschichte? Was genau braucht
denn so viel Speicher?
Vielen Dank
Jens
> Aber sobald ich die erste Berechnung ablaufen lasse
> sind es am ende der ersten Berechnung genau 291 und 290 sleeping. Das deutet
> doch darauf hin, daß die Threads nicht beendet haben, oder kann das an
> irgendeiner ORB Geschichte liegen?
OutOfMemory kommt auch, wenn zu viele Threads laufen --- es kann dann
kein zusammenhaengender Bereich fuer den Stack gefunden werden.
Schick doch mal ein QUIT-Signal an Deine VM. Wenn sie im Vordergrund
laeuft, reicht es, in der Shell ^-\ (Control-Backslash) zu druecken;
alternativ 'kill -QUIT <pid>'. Die VM gibt Dir dann die Stacks aller
laufenden Threads aus, und Du kannst sehen, ob Deine noch am Start
sind.
Matthias