2017-07-17 2 views
0

Ich habe ein Java-Programm, das jede Minute eine Datenbank überprüft, um zu sehen, ob eine bestimmte Website überwacht werden muss. Wenn es die Bedingung erfüllt, übergebe ich die Website-URL in meinem anderen Java-Programm (runnable jar) mit ProcessBuilder ... und es überwacht die Website wie ich es erwarte.Monitore von einem Haupt-Java-Programm starten

Allerdings scheint dies zu großen Speicherlecks führen. Ich scheine eine "Java out of memory exception" zu bekommen, selbst wenn nur ein paar Webseiten überwacht werden ... und ich frage mich, ob es einen besseren Weg gibt, dies zu tun, als eine JAR aus einer JAR heraus aufzurufen.

Dies ist, wie ich Kick-off zur Zeit eine Website Monitor:

if(URL.length() > 1) { 

     ProcessBuilder builder = new ProcessBuilder("java", "-jar", "/usr/opt/monitor/Monitor.jar", URL); 
     builder.redirectErrorStream(true); 
     builder.redirectOutput(new File("/usr/opt/logs/Monitor.log")); 
     Process p = builder.start(); 

Kann jemand bitte bitte einen besseren Weg, dies zu erreichen vorschlagen? Gewindeschneiden? Rufen Sie die Klasse direkt von Monitor.jar auf?

+1

Zuerst müssen Sie die Quelle des Speicherlecks finden. Und nur dann versuche es zu beheben. – talex

+0

Wenn Sie separate Apps benötigen, können Sie eine JMS-Warteschlange verwenden, zu der Ihre App jedes Mal eine Nachricht veröffentlichen würde, wenn eine Website überwacht werden muss und eine andere App diese Warteschlange abonniert und einen Thread erstellt (mit Ihrer Überwachungslogik) für jede empfangene Nachricht. – Maaaatt

+0

Jeder Prozess hat seinen eigenen Speicherplatz, also müssen Sie prüfen, welcher Prozess den nicht ausreichenden Speicher verursacht und diese Anwendung analysieren müssen. Ich denke, dass dies nichts mit der Art zu tun hat, wie der Monitorprozess gestartet wird. – OTM

Antwort

0

Jeder Prozess verursacht einen erheblichen Speicheraufwand. Die einfachste Möglichkeit, Prozesse loszuwerden, besteht darin, die Methode main(String[]) der Hauptklasse der JAR-Datei direkt im aufrufenden Prozess in einem separaten Thread auszuführen. Um die Anzahl der Threads zu begrenzen, die gleichzeitig ausgeführt werden, empfiehlt es sich, einen Thread-Pool mit einer festgelegten Anzahl von Threads zu verwenden. Andernfalls kann aufgrund einer zufälligen Erhöhung der Anzahl der zu verarbeitenden URLs der Arbeitsspeicher knapp werden.

Wenn diese Maßnahmen nicht wirksam werden, liegt ein Speicherverlust im Überwachungsprogramm vor.

Verwandte Themen