Jump to content

[Java] BugReport... java.lang.OutOfMemoryError: ... Durch IPConnection


Quantasy

Recommended Posts

Hab da glaub ich ein Thread-Alloc no De-Alloc Problem gefunden:

 

Folgender Testcase:

while (true){
try{
IPConnection ipConnection = new IPConnection();
ipConnection.connect("host_den_es_nicht_gibt",4223);
}catch(Exception ex){
  //Hier wirds immer wieder rein kommen, da UnknownHostException
}
}

Das wird ziemlich schnell zu einem MemoryError führen. Grund ist hier:

// NOTE: Assumes that socket is null and socketMutex is locked
void connectUnlocked(boolean isAutoReconnect) throws java.net.UnknownHostException,
                                                     java.io.IOException {
	if(callbackThread == null) {
		callbackQueue = new LinkedBlockingQueue<CallbackQueueObject>();
		callbackThread = new CallbackThread(this, callbackQueue);
		callbackThread.start();
	}

	Socket tmpSocket = new Socket(host, port);
...

 

Nachdem der callbackThread gestartet wurde, wird ein Socket erstellt und der wirft eine Exception und die Methode wird verlassen... Der Thread aber... der läuft !jeweils! weiter.

 

Vorschlag auf die Schnelle:

 

// NOTE: Assumes that socket is null and socketMutex is locked
void connectUnlocked(boolean isAutoReconnect) throws java.net.UnknownHostException,
                                                     java.io.IOException {
try{
	if(callbackThread == null) {
		callbackQueue = new LinkedBlockingQueue<CallbackQueueObject>();
		callbackThread = new CallbackThread(this, callbackQueue);
		callbackThread.start();
	}

	Socket tmpSocket = new Socket(host, port);
...
}catch(Exception ex){
   callbackQueue.put(new CallbackQueueObject(QUEUE_EXIT, (byte)0,(short)0,0, null));
   throw ex;
}

 

 

Link to comment
Share on other sites

  • 2 weeks later...
  • 3 months later...

Ou, da hab ich einen Task übersehen, der an mich gegangen ist...

 

Was ich weiss: In den 2.1.13 Bindings ist der Memory-Fresser noch drin.

(Mit dem Beispielprogramm, von oben frisst der Java-Prozess pro Sekunde etwa 500kB)

Aber das ist vielleicht, weil ich hier nie geantwortet habe. Soll ich das hier angehängte noch testen? Es scheint mir, als ob das mit dem 2.1.13 bzgl. aufräument im connect() ziemlich übereinstimmt.

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...