2012-06-02 54 views
6

所以我用VisualVM來分析我的應用程序。VisualVM socket.read

我打一個熱點有關我的MySQL互動。我的第一個想法是,這個熱點顯示了我的應用程序在IO之後等待的時間。但在剖析報告中,VisualVM有兩列「時間」和「時間(cpu)」。也許這個詞被錯誤地使用了,但我假設自己的時間(cpu)列不包括IO時間。經過更多調試之後,我們得出結論認爲假設是錯誤的,並且顯示IO時間,因爲熱點位於MySQL驅動程序的java.net.SocketInputStream.read()以及其他不需要任何cpu成本的IO事物上。

所以,我的問題是,爲什麼VisualVM的報告SocketInputStream.read()的CPU時間?

Screnshot

+0

也許有一些忙碌的等待,例如,在循環中調用'available()'? –

+0

對不起,我的錯誤。它在java.net.SocketInputStream.read() – plcstpierre

回答

4

本地電話始終處於可運行狀態,同時監視線程活動,可能是因爲JVM沒有辦法知道,如果本地通話是睡覺還是真的在做事情。 因此,在RUNNABLE狀態下經過的時間計爲CPU時間。

+1

謝謝!這正是我正在尋找的。 – plcstpierre

0

SocketInputStream.read()塊,直到有可用從另一側數據。所以這可能是您的數據庫緩慢的迴應。

+0

我知道。這不是我的問題。我的問題是爲什麼visual vm將它標記爲cpu使用情況? – plcstpierre

1

This very long thread聲稱,小型寫入可能會造成問題。這是值得一讀的,但我不知道你能做些什麼。你能做什麼?你可以確保你沒有使用小的fetch size。這不會給你小的寫入,但會導致相同問題的小讀取。您可以爲客戶端或服務器嘗試不同的平臺。有一個在this bug讀取評論:

「我們已經看到如何快速I/O緩衝區得到填補Solaris和Linux之間千差萬別不同的行爲(因此調用ReadAheadInputStream.fill()的數量,因爲它讀取了可用的內容,除非需要閱讀更多內容,否則它不會阻止)「。

+0

謝謝,這是有見地的,但它不是我正在尋找的答案:( – plcstpierre