【发布时间】:2016-02-29 20:37:37
【问题描述】:
我有一个程序需要以大致固定的时间间隔运行,永远永远。我找到了 ScheduledExecutorService 并注意到它的 scheduleAtFixedRate() 方法。 There's a simple tutorial here.
我的问题是,如果我的程序继续按预期运行(大约每 60 秒直到时间结束),如果我使用上述方法,是否需要做任何事情来处理垃圾收集?我需要关闭线程等吗?我应该运行 System.gc 吗?我还在习惯 Runnables。
目前我正在使用 while 循环和 thread.sleep(60000) 每 60 秒执行一次任务。虽然这种方式没有垃圾收集,但在运行了几天后,我的程序最终使用了超过 70% 的服务器内存。
感谢您提供的任何帮助。感谢您抽出宝贵时间帮助我解决新手问题。这基本上是我 Java 之旅的第二年!
【问题讨论】:
-
垃圾收集自动运行。如果您的进程随着时间的推移消耗越来越多的内存,那么您就有资源泄漏。
-
java 垃圾收集器使用标记和清除算法来回收内存(这意味着当它运行时,它必须停止执行以进行垃圾收集)。 JVM 在整个执行过程中定期调用 GC,但它没有指定何时或如何调用它。这也意味着在多线程程序中,GC 可能无法很好地清理内存,因为堆上的对象可能被认为“仍在使用中”。 This 可能会有所帮助。
-
阅读this question,了解多线程上下文中的 Java GC。
-
@callyalater 实际上有很大帮助!我的程序的一部分是多线程的,因为该特定类同时与一大堆远程设备进行通信。我使用 Future 从每个远程设备获取结果。我猜这可能是造成我痛苦的原因。
标签: java garbage-collection runnable scheduledexecutorservice