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()是正确的(不泄漏内存),您的代码就可以了。也许不漂亮,但很好。

一个不相关的小改进 - 如果您想每分钟读取一次文件(而不是:每次读取之间睡眠一分钟),您必须考虑时间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 回答