2017-07-17 78 views
0

我有一个java程序,每分钟检查一次数据库,看看是否需要监视某个网站。如果符合条件,我使用ProcessBuilder将网站URL传递到我的其他Java程序(可运行jar)中,并按照我的预期监控网站。从主java程序启动监视器

但是,这似乎是造成巨大的内存泄漏。我似乎得到了“Java内存异常”,即使只有少数网站受到监视......我想知道是否有更好的方法来做到这一点,而不是从JAR中调用JAR。

这是我目前正在揭开序幕网站监测:

if(URL.length() > 1) { 

     ProcessBuilder builder = new ProcessBuilder("java", "-jar", "/usr/opt/monitor/Monitor.jar", URL); 
     builder.redirectErrorStream(true); 
     builder.redirectOutput(new File("/usr/opt/logs/Monitor.log")); 
     Process p = builder.start(); 

任何人都可以请建议实现这一目标,请更好的方法?线程?直接从Monitor.jar调用该类?

+1

首先你需要找到内存泄漏的来源。只有然后尝试修复它。 – talex

+0

如果您的要求之一是要有单独的应用程序,那么您可以使用JMS队列,每当需要监视网站时应用程序将发布消息,并让另一个应用程序订阅此队列,并创建一个线程(使用您的监控逻辑)收到的每条消息。 – Maaaatt

+0

每个进程都有自己的内存空间,因此您需要检查哪个进程导致内存不足,需要分析该应用程序,我认为这与监视进程的启动方式无关。 – OTM

回答

0

每个进程都会导致显着的内存开销。摆脱进程的最简单方法是直接在调用进程中的独立线程中运行jar文件主类的方法main(String[])。为了限制同时运行的线程数量,使用线程池数量固定的线程池是值得的,否则可能会由于意外增加要处理的URL数量而导致内存不足。

如果这些措施不会生效,那么您在监视程序内部存在内存泄漏。