現在越來越多的公司將服務通過容器來部署,但這里其實對Java的應用有一個坑。很多超時敏感的應用其實對GC的要求還是比較高的,減少GC的時間變得很重要,比如你可以根據當前機器的CPU核數得到一個較好的並發GC線程數 -XX:ParallelGCThreads,從而減少STW的時長。
但在早期的JDK版本中,比如我們使用的Jdk1.8u102,當你使用Java的Runtime獲取CPU數量時,在容器里面會返回容器所在宿主機的核數,而不是容器自身的:
int cores = Runtime.getRuntime().availableProcessors();
這其實是JDK的一個問題,已經trace在JDK-8140793,原因是獲取CPU核數是通過讀取兩個環境變量,其中
| ENV | Description |
|---|---|
| _SC_NPROCESSORS_CONF | number of processors configured |
| _SC_NPROCESSORS_ONLN | The number of processors currently online (available) |
其中_SC_NPROCESSORS_CONF 就是我們需要容器真實的CPU數量。

獲取CPU數量的源碼
怎么解決
第一種辦法是使用新版本的Jdku131以上的版本1。
另外一個辦法是使用自編譯上面的源代碼,通過LD_PRLOAD的方式將修改后的so文件加載進去Mock掉CPU的核數
