所以我不是一个线程专家,也不是java那个问题。
好吧所以我做了一个运行无限的小程序..(它应该是)
每分钟从XML文件中获取数据并打印出来。 xml每几秒钟更新一次,但只需要1分钟的打印时间。 所以我的主要看起来像这样。
while(true) {
try {
Thread.sleep(60000);
String data = getSomeDataFromXMLFile();
System.out.println(data);
} catch (InterruptedException e) {
e.printStackTrace();
}
代码的工作方式如何。只是想知道它是否会以任何方式影响我的服务器性能?就像经过10天的运行一样,它会占用所有RAM或其他东西..
非常欢迎建议和改进。
答案 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)
根据我上周所做的事情,我构建了一个运行无限循环并执行某些事务的东西。我注意到如果出现以下情况就没问题了:
答案 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发生变化时运行。