我有一個簡單的3層設置的Apache服務器,它向Tomcat服務器發送請求,該服務器查詢(MySQL)數據庫以生成HTML結果。我發現只要Tomcat啓動,Java進程中就有線程正在旋轉,從而產生futex()調用。幾十次Web請求之後,試圖服務請求的線程會陷入相同的futex()循環中,並且它會停止迴應所有請求 - 它們會在客戶端超時。futex()調用的Tomcat java線程
我已經在Tomcat 6和Tomcat 7中嘗試了這個。我已經用Oracle的Java 1.7.0_45和OpenJDK 1.6.0嘗試了它。這個虛擬機是一個64位的Redhat 6系統,我已經嘗試了他們發佈的2.6.32-358.23.2內核和它們的2.6.32-431.3.1內核,並且所有組合都以strace顯示了這些系統調用,並最終鎖定向上。
futex(an addr, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {a timestamp}, ffffffff)
= -1 ETIMEDOUT (Connection timed out)
futex(an addr, FUTEX_WAKE_PRIVATE, 1) = 0
JVM使用默認內存執行此操作,或者即使將可用內存增加到3GB(機器上的4GB)。我用GC記錄器運行,GC打印了一些小的集合,並且在鎖定發生時沒有執行一個。這臺機器於2014年1月創建,所以不會出現任何「閏秒」情況。
所以我的問題是:即使JVM應該「閒置」,爲什麼Java會以快速循環的方式製作所有這些futex()調用?他們是否正常?他們是否應該超時?並有一個已知的修復?
感謝您的信息洞察。