2013-05-01 65 views
0

我開始假設單個核心機器只能運行一個線程。現在我寫了一個基於java/spring的junit測試,它生成20個線程,並使用BigDecimal計算大數的階乘。jvm如何處理運行狀態下的許多線程

我監測到與Visual VM的junit,我可以看到所有20個線程工作,並顯示爲在可視VM中運行(綠色)。據我瞭解,jvm使它們看起來好像它們都在運行,但在非常細化的層面上,每個線程都將輪流用於CPU週期。有沒有一種方法或工具可以通過視覺或數字證明所有線程都相互干擾,並且CPU從一個線程切換到另一個線程?或者換句話說,我想看看給定函數的給定數量的線程,由於CPU的極端上下文切換,飽和點或遞減回報是多少。

我需要解決的實際問題是調整大型Java應用程序中的線程。如果我在示例運行中看不到線程爭用,那麼我將無法在大型應用程序中看到線程爭用/濫用。

回答

0

有沒有一種方法或工具可以通過視覺或數字證明所有線程互相干擾並且CPU從一個線程切換到另一個線程?

簡短答案是「否」。如果在Linux系統上,您可以通過查看擴展的ps輸出中列出的克隆進程來確定哪些線程實際工作,但即使如此,我也懷疑您能夠獲得您需要的分辨率有用。那麼你有Hiezenberg問題,如果你足夠快的採樣,你會顯着影響你試圖監測的盒子的性能。你可以看看使用每個線程的CPU時間並做出某種確定,儘管CPU時間可能包括上下文切換開銷。

如果您試圖找出最適合您應用程序的線程數,那麼我建議您進行一些測試運行以確定不同線程池大小的最佳吞吐量。當然,如果您切換架構,您將不得不重新運行測試,因爲它非常依賴於CPU,內核,內存等。