我有一个java程序,每分钟检查一次数据库,看看是否需要监控某个网站。如果它满足条件,我使用ProcessBuilder将网站URL传递给我的其他java程序(runnable jar)......它会像我期望的那样监视网站。
然而,这似乎导致了巨大的内存泄漏。即使只有少数几个网站受到监控,我似乎也得到了一个" 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调用该类?
答案 0 :(得分:0)
每个进程都会导致大量内存开销。摆脱进程的最简单方法是在一个单独的线程中直接在调用进程中运行jar文件主类的方法main(String[])
。要限制同时运行的线程数,使用具有固定线程数的线程池是值得的,否则由于要处理的URL数量的意外增加,您可能会耗尽内存。
如果这些措施无法生效,那么监控程序内部就会发生内存泄漏。