4

したがって、私はスレッドの専門家ではなく、その点については Java ではありません。

さて、私は無限に実行される小さなプログラムを作成しました..(はずです)

毎分 XML ファイルからデータを取得し、出力します。xml は数秒ごとに更新されますが、1 分間の印刷のみが必要です。したがって、私のメインは次のようになります。

while(true) {
   try {
       Thread.sleep(60000);
       String data = getSomeDataFromXMLFile();
       System.out.println(data);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }

コードは想定どおりに機能します。サーバーのパフォーマンスに何らかの影響を与える可能性があるかどうかを知りたいだけですか? 10日間実行した後のように、すべてのRAMまたは何かを占有します..

提案と改善は大歓迎です。

4

6 に答える 6

10

getSomeDataFromXMLFile()それが正しい (メモリ リークがない)と仮定すると、コードは問題ありません。美しくはないかもしれませんが、大丈夫です。

1 つの小さな無関係な改善 - 毎分ファイルを読み取りたい場合 (読み取りごとに 1 分間スリープするのではなく)、時間をgetSomeDataFromXMLFile()考慮する必要があります。

クラスを検討Timerして、コードを少し縮小し、上記の問題を回避します。

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        String data = getSomeDataFromXMLFile();
        System.out.println(data);
    }
}, 0, 60000);
于 2012-12-21T07:52:32.367 に答える
3

先週行ったことに基づいて、無限ループを実行し、いくつかのトランザクションを実行するものを作成しました。次の場合は問題ないことに気付きました。

  1. 実行される各スレッドは、そのトランザクションを終了します。そうでない場合は、JVM がスレッドを保持できなくなるまで存続し、プログラムはスレッドを作成し続けるためです。
  2. メモリ リークがある場合、JVM がクリアできないオブジェクトがあります。
于 2012-12-21T07:53:03.213 に答える
1

投稿したコードにはメモリ リークは含まれていません。Java では、自動ガベージ コレクションを使用するため、通常はメモリ リソースを明示的に解放する必要はありません。古い値に代入するdataと参照されなくなり、ガベージ コレクションの対象になります。ガベージ コレクターが次に実行されると、自動的に解放されます。ガベージ コレクターは必要に応じて実行されます。明示的に実行するように指示する必要はありません。

ただし、メソッド内のファイル ハンドルなどのリソースを確実に閉じるように注意する必要がありますgetSomeDataFromXMLFile

于 2012-12-21T07:51:07.860 に答える
1

10日間実行した後、すべてのRAMまたは何かを占有しますか?

実装方法によって異なりますgetSomeDataFromXMLFile()

確信が持てれば、その方法は可能な限り最適化されています。サーバーにはまったく影響しません。

于 2012-12-21T07:52:26.550 に答える
0

これらは確かにRAMを占有しません。同じデータオブジェクトに割り当てているため、必要に応じて古いデータオブジェクトのメモリがガベージコレクターによって回収されます。また、複数のスレッドを使用している場合は、スレッドが死ぬべきときに死んでいるかどうかをデバッグします。死んでいない場合は大きな問題があり、スレッドが RAM を占有し、ヒープ不足を引き起こす可能性があります。

于 2012-12-21T07:51:56.703 に答える
0

あなたが投稿したコードは大丈夫です。はるかに短い時間間隔の無限ループでも問題なく見たことがありますが、それは getSomeDataFromXML() メソッドでリソースをどのように管理するかにかかっています。

とにかく、Java 7 で利用可能な変更の監視ディレクトリを確認できます: http://docs.oracle.com/javase/tutorial/essential/io/notification.html そうすれば、XML が変更された場合にのみ実行されます。

于 2012-12-21T07:55:23.460 に答える