2011-01-27 65 views
4

我的問題是,JVM是否共享與線程或進程相關的某種資源,可能導致ProcessBuilder性能在正常使用一個月或更長時間後出現峯值?對所有應用程序使用java 6 update 21。需要關於在Solaris下運行Java的ProcessBuilder的幫助

在過去的幾個月中,我們注意到我們的數據中心(運行Solaris 10的Sparc M4000)中的一臺服務器可以運行大約6-8周而沒有任何問題。然而,很快,利用ProcessBuilder類運行腳本的應用程序的性能會受到巨大的性能影響 - ProcessBuilder.start有時會花費一分鐘以上。重新啓動後,以及幾個星期後,正常返回時間在10秒或100毫秒範圍內。

我編寫了一個獨立的小應用程序,創建5個線程,每個線程使用ProcessBuilder連續運行10次'ls'命令,然後從中收集統計信息以監視原始問題。此應用程序在每次運行後退出,並且每小時只從cron運行一次。通常只需要一兩秒鐘。

昨天晚上,正常運行45天后,每次ProcessBuilder.start調用後,ProcessBuilder時間再次超過一分鐘。

top顯示沒有內存或CPU豬。我確實試圖在測試應用上做一個jstack,但得到錯誤「無法創建thread_db代理」。

任何想法?

+0

我的猜測是你掛在某些東西上,而你正在讓GC努力工作。你有verbosegc日誌嗎? – 2011-01-27 18:24:50

回答

4

我們的應用程序在Linux中運行時遇到類似問題。 Linux JVM代碼使用分支,這意味着每次執行時都會映射和複製地址空間。我們正在執行許多短暫的短暫過程。看起來你的應用程序的一個主要區別是我們有一個相對較大的堆(大約240GB),所以我相信這會產生影響。我們最終使用JNI和posix spawn實現了我們自己的產卵代碼。這裏是一個問題/答案的鏈接:Slowing process creation under java