2017-07-17 74 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數量而導致內存不足。

如果這些措施不會生效,那麼您在監視程序內部存在內存泄漏。