2017-07-17 8 views
0

私は、毎分データベースをチェックして、特定のウェブサイトを監視する必要があるかどうかを確認するJavaプログラムを持っています。それが条件を満たしていれば、私はProcessBuilderを使って他のJavaプログラム(runnable jar)にWebサイトのURLを渡します...そして、私が期待するようにWebサイトを監視します。メインJavaプログラムからモニタを蹴る

しかし、これは膨大なメモリリークを引き起こしているようです。少数のウェブサイトしか監視されていなくても、「Java Out of Memory Exception」が発生するようです... JAR内からJARを呼び出すよりも、これを行うより良い方法があるのだろうかと思います。

これは、私は現在、ウェブサイトのモニターをキックオフする方法である:

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(); 

誰もがこれをしてください達成するためのより良い方法を提案してくださいことはできますか?スレッディング? Monitor.jarから直接クラスを呼び出しますか?

+1

まず、メモリリークの原因を見つける必要があります。そしてそれを修正しようとするだけです。 – talex

+0

あなたの要件の1つが別々のアプリケーションを持つことである場合、Webサイトを監視する必要があるたびにメッセージを公開するJMSキューを使用し、このキューに別のアプリケーションを登録してスレッドを作成する受信したメッセージごとに(監視ロジックを使用して)送信されます。 – Maaaatt

+0

各プロセスには独自のメモリ領域があるため、どのプロセスがメモリ不足の原因であるかを確認し、そのアプリケーションを分析する必要があります。また、監視プロセスの開始方法とは関係がないと思います。 – OTM

答えて

0

各プロセスによって大きなメモリオーバーヘッドが発生します。プロセスを取り除く最も簡単な方法は、jarファイルのメインクラスのメソッドmain(String[])を別のスレッドの呼び出しプロセスで直接実行することです。同時に実行するスレッドの数を制限するには、スレッド数を固定したスレッドプールを使用する必要があります。そうしないと、処理するURLの数が偶然増えてメモリが不足する可能性があります。

これらの措置が有効にならない場合は、監視プログラム内でメモリリークが発生します。

関連する問題