我有一個Java程序,用於在多個處理器之間進行一系列科學計算,方法是將其拆分爲不同的線程並在其中運行各個部分。這個問題很簡單,因此線程之間不存在爭用或通信。他們訪問的唯一常見數據是一些共享靜態緩存,不需要同步訪問權限,也可以訪問硬盤上的一些數據文件。線程也連續寫入磁盤,但分開文件。Java在Mac OS上的隨機速度減慢
我的問題是,有時當我運行該程序時,我獲得了非常好的速度,有時當我運行完全相同的東西時,它運行得非常緩慢。如果我看到它運行緩慢並按Ctrl-C並重新啓動它,它通常會再次開始快速運行。它似乎在運行的早期階段將其自身設置爲低速模式或快速模式,並且從不在模式之間切換。
我已經把它連接到jconsole,它似乎不是一個內存問題。當我發現它運行緩慢時,我嘗試連接一個探查器,但探查器無法連接。我試着用-Xprof運行,但慢速運行和快速運行之間的轉儲似乎沒有太大的差別。我也嘗試過使用不同的垃圾收集器和內存空間各個部分的不同尺寸。
我的機器是具有條帶化RAID分區的mac pro。 CPU的使用率永遠不會下降,無論它運行緩慢還是很快,如果線程花費太多時間阻塞從磁盤讀取數據,您會期望這種情況,所以我不認爲這可能是磁盤讀取問題。
我的問題是,我的代碼有哪些類型的問題可能導致這種情況?或者這可能是一個操作系統問題?我一直無法在一臺機器上覆制它,但我沒有一臺類似RAID設置的Windows機器。
嘗試使用「java -server」運行,也許它隨機選擇不使用JIT?你怎麼能確保不同的線程運行在不同的處理器/內核上? – 2009-10-30 20:33:31
@Piligrim,如果他使用默認配備64位Java 6的Mac OS X Snow Leopard,他已經在使用服務器版本。如果JVM會隨機選擇不使用JIT,這將是非常奇怪的 - 這不是一個現實的場景...... – Jesper 2009-10-30 22:15:46
是的,我一直在使用-d64,顯然是代替服務器。 – javajustice 2009-10-30 22:18:12