2012-12-21 31 views
4

所以我不是一个线程专家,也不是java的事。运行一个无限的java程序,以及性能如何受到影响

好了,所以我做了一个运行无限。(它应该)一个小程序

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

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

该代码的工作原理如何。只是想知道它是否会以任何方式影响我的服务器性能?就像运行10天后,它会耗尽所有内存或其他东西。

建议和改进非常受欢迎。

+2

TimerTask可能更适合这种功能,但我没有看到您当前的解决方案的任何问题。 – 1615903

+0

这一切都取决于你的应用程序是否有一些内存泄漏... – home

+0

这段代码不会提示泄漏。发布整个代码。 –

回答

3

基于我上周做了,我建立了一个运行一个无限循环,并做一些交易的东西。我注意到,如果发生以下情况,将不存在任何问题:

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

我看到了,感谢链接错误刷了内存泄漏马上:) – Rayf

+0

+1,如果你看到一个问题,这将是由于你的代码中的错误。没有什么特别的原因不能连续运行多年。 –

1

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

但是,您应该注意确保关闭getSomeDataFromXMLFile方法内的任何资源,例如文件句柄。

0

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

1

就像运行10天后,它猪全部内存或东西?

这取决于getSomeDataFromXMLFile()是如何实施的。

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

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

收缩?你的代码有一个源代码行,并没有异常处理程序。 –

+1

@MartinJames:好的,不是字面上的。在复杂性方面缩小。没有额外的线程(注意OP可能使用'main',但通常情况并非如此),InterruptedException不必处理,不相关的'sleep()'不再存在。但从某种角度来说 - 我的代码更复杂,因为它使用更复杂的结构+1。 –

相关问题