2014-02-06 62 views
0

我已經在我們的Java程序中的一個臨到一個奇怪的問題之間執行。偶爾偶爾會有一些線程延遲執行25秒。這發生了1-2分鐘,然後應用程序恢復正常處理。這是一個嚴格的時間要求的電話應用程序,所以這是不可接受的。Java的延遲非阻塞語句

調用類

OCSIHandling ocsiHandler = new OCSIHandling(this.arg0); 
    ocsiHandler.run(); 

構造

public OCSIHandling() 
    { 
    //This is the last statement of the constructor after initializations 
      logger.info("[" + refId + "][OCSI] SMS IDP"); 
    } 

類方法

run(){ 
    //This is the first statement of the method which is executed with delay 
    logger.info("[" + refId + "][OCSI] in run()"); 
    } 

樣的問題時日誌

INFO 2014-02-07 06:03:27674 [線程143840672] 100 - [MGW070214060327d384] [OCSI] SMS IDP INFO 2014-02-07 06:03:49771 [線程143840672] 123 - [MGW070214060327d384] [ OCSI]在運行()

有執行中的延遲,49-27 =22秒

程序是與一個32位的HotSpot服務器VM -server選項運行。在此期間,日誌記錄也按時間順序排列。 1:00:01時間戳1:00:00之前寫的等。沒有線程池。

我們正在使用的CentOS 5.4,VMware的客戶端上64位。應用程序是CPU密集型而沒有太多的內存需求(其擁有1GB的默認堆大小運行),所以我不知道,如果GC能引起這麼多的延遲。

的logback文件:http://pastebin.com/fpxYBYew

請點我什麼可能的因素可能會導致這種行爲。

編輯:這發生在非高峯

+1

嘗試使用一個分析器。商業(YourKit,JProfiler的...)或VisualVM的(免費) – Jayan

+0

這是可以探查器附加到應用程序JVM。 –

+0

是這個ur自定義類還是java.lang.Class? – Arvind

回答

1

莫非你運行到一個垃圾收集問題?運行程序時將以下選項添加到java命令(這些將包括主類名之前,或之前-jar選項):-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

這將導致打印大約垃圾收集器性能的詳細信息控制檯(您可能需要將輸出重定向到文件)。有免費的程序可用來分析輸出,但在你的情況下,只是尋找完整的垃圾收集和檢查他們採取的時間可能就足夠了。

+1

哇我以爲我不能用-server jvm參數運行到低內存需求應用程序的GC問題。將GC更改爲G1,問題已解決。 -XX:+ UseG1GC -XX:MaxGCPauseMillis = 400 –