Hat mein ThreadPoolExecutor Speicher verloren?

8

Ich verwende ein ThreadPoolExecutor Aufgaben ausführen Das Backend ist ein SynchronousQueue , also wenn der Executor führt bereits eine Aufgabe aus, die RejectedExecutionException . Hier ist ein einfacher Testfall:

%Vor%

Der erwartete bahavious ist: Führen Sie den Worker aus, und nachdem Sie eine Sekunde geschlafen haben, drucken Sie i aus (Angabe, wie oft der Worker bisher ausgeführt wurde) und die Anzahl der Millisekunden seit der Erstellung des Worker. Also ich erwarte:

%Vor%

Das funktioniert eine Weile, aber nach fast einer Stunde:

%Vor%

Die Zeitspanne zwischen einer Arbeiterausführung und der nächsten beträgt 20 Sekunden (2919 & gt; 2920) und 38 Sekunden (2920 & gt; 2921) und so weiter. Alles wird extrem langsam und der JVM verbringt viel Zeit in der Garbage Collection. Endlich (nach ein paar Tagen) stoße ich auf einen OutOfMemoryError.

Ich führe das mit -Xmx8M (ich nehme an, der Effekt erscheint viel später mit mehr Heap-Speicherplatz) auf Oracle JVM 1.7.0_07 auf einem 64-Bit Linux-Rechner. Ich würde alle Hinweise schätzen, aber wahrscheinlich vermisse ich nur das Offensichtliche.

    
Clayton Louden 15.10.2012, 21:28
quelle

1 Antwort

2

Sie können versuchen, die ThreadPoolExecutor Instanziierung zu ändern. Sie müssen dem Konstruktor nur ein Argument hinzufügen, um ein RejectExecutionHandler zu verwenden, das abgelehnte Aufgaben stillschweigend verwirft.

%Vor%

Also Wenn Ihr Problem von wiederholtem RejectedExecutionException kommt (und ich denke schon), werden Sie es vermeiden.

    
garciap 16.10.2012 13:17
quelle

Tags und Links