Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从主java程序启动监视器_Java_Multithreading_Selenium Webdriver - Fatal编程技术网

从主java程序启动监视器

从主java程序启动监视器,java,multithreading,selenium-webdriver,Java,Multithreading,Selenium Webdriver,我有一个java程序,每分钟检查一个数据库,看看某个网站是否需要监控。如果它满足条件,我将使用ProcessBuilder将网站URL传递到我的另一个java程序(runnable jar)中。。。正如我所期望的那样,它监控着网站 然而,这似乎导致了巨大的内存泄漏。我似乎得到了一个“Java内存不足异常”,即使只有几个网站被监控。。。我想知道是否有更好的方法来做到这一点,而不是从一个罐子里调用一个罐子 这就是我目前启动网站监视器的方式: if(URL.length() > 1) {

我有一个java程序,每分钟检查一个数据库,看看某个网站是否需要监控。如果它满足条件,我将使用ProcessBuilder将网站URL传递到我的另一个java程序(runnable jar)中。。。正如我所期望的那样,它监控着网站

然而,这似乎导致了巨大的内存泄漏。我似乎得到了一个“Java内存不足异常”,即使只有几个网站被监控。。。我想知道是否有更好的方法来做到这一点,而不是从一个罐子里调用一个罐子

这就是我目前启动网站监视器的方式:

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调用类?

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


如果这些措施不起作用,则说明监控程序中存在内存泄漏。

首先,您需要找到内存泄漏源。然后再尝试修复。如果您的需求之一是要有单独的应用程序,您可以使用JMS队列,您的应用程序将在每次需要监视网站时向其发布消息,并让另一个应用程序订阅此队列,这将创建一个线程(使用您的监视逻辑)每个进程都有自己的内存空间,因此您需要检查哪个进程导致内存不足,并需要分析该应用程序,我认为这与监视进程的启动方式无关。