运行无限的java程序以及性能如何受到影响

时间:2012-12-21 07:45:31

标签: java multithreading performance infinite-loop

所以我不是一个线程专家,也不是java那个问题。

好吧所以我做了一个运行无限的小程序..(它应该是)

每分钟从XML文件中获取数据并打印出来。 xml每几秒钟更新一次,但只需要1分钟的打印时间。 所以我的主要看起来像这样。

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

代码的工作方式如何。只是想知道它是否会以任何方式影响我的服务器性能?就像经过10天的运行一样,它会占用所有RAM或其他东西..

非常欢迎建议和改进。

6 个答案:

答案 0 :(得分:8)

假设getSomeDataFromXMLFile()是正确的(不会泄漏内存),您的代码就可以了。也许不漂亮,但很好。

一个小小的无关改进 - 如果你想每分钟阅读一个文件(而不是:每次阅读之间睡一分钟),你将不得不考虑getSomeDataFromXMLFile()的时间。

考虑Timer类来缩小代码并避免上述问题:

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        String data = getSomeDataFromXMLFile();
        System.out.println(data);
    }
}, 0, 60000);

答案 1 :(得分:3)

根据我上周所做的事情,我构建了一个运行无限循环并执行某些事务的东西。我注意到如果出现以下情况就没问题了:

  1. 每个运行的线程都将完成其事务。因为如果没有,它将保持活跃状态​​,你的程序将继续创建线程,直到你的JVM不再能够持有一个线程。
  2. 如果有a memory leak,那么您的JVM将无法清除某些对象。

答案 2 :(得分:1)

您发布的代码不包含内存泄漏。在Java中,您通常不需要显式释放内存资源,因为它使用自动garbage collection。分配给data时,不再引用旧值,并且符合垃圾回收条件。它将在垃圾收集器下次运行时自动释放。垃圾收集器将根据需要运行 - 您无需告诉它显式运行。

但是,您应该小心确保在getSomeDataFromXMLFile方法中关闭任何资源,例如文件句柄。

答案 3 :(得分:1)

  

就像经过10天的运行一样,它会占用所有内存还是什么?

这取决于getSomeDataFromXMLFile()的实现方式。

如果您确定,那些方法尽可能优化。它根本不会影响服务器。

答案 4 :(得分:0)

这些不会在RAM上占用,因为您分配给相同的数据对象,旧数据对象的内存将在需要时由垃圾回收器回收。此外,如果你有多个线程,调试线程是否应该死,如果没有死,你有很大的问题,线程会占用RAM,这可能导致堆短缺。

答案 5 :(得分:0)

您发布的代码没问题。我已经看到甚至更低的时间间隔无限循环没有问题,这一切都取决于你如何管理getSomeDataFromXML()方法中的资源。

无论如何,您可以检查监视目录以查找Java 7可用的更改:http://docs.oracle.com/javase/tutorial/essential/io/notification.html 这样它只会在XML发生变化时运行。