一台後端server,OS為Slackware 8.1,裝了tomcat 4.1.30,近期在繁忙時期經常會死機,死狀就是"Java.lang.OutOfMemoryError: unable to create new native thread".是tomcat創建不了新的線程來應答請求了。於是我搭了一個環境專門來測試這個問題。內存為2G,CPU為四顆2.8G,tomcat 4.1.30,寫一個最簡單的JSP頁面,如下:
代碼
<%
try
{
Thread.sleep(30000);
out.println("fuck");
} catch (InterruptedException e) {
e.printStackTrace();
} %>
然後開Jmetor來壓,同時開jconsole來監測tomcat的情況,並不斷調整XMX,XMS,XSS這三個參數,得出下表:
XMX XMS XSS down時的tomcat thread數
500M 500M 128K 642
800M 800M 64K 485
1024M 1024M 64K 374
1024M 1024M 128K 374
1024M 1024M 512K 371
根據該表,可以看出,隨XMX,即是分配給JVM的內存數越大,tomcat所能開的thread數就越小,而Xss這個參數幾乎不影響任何測試結果。我猜想tomcat開線程是使用Linux的內存,而不是JVM的內存。當分配給JVM的內存越大,操作系統所能用於分配的內存就越小,於是所能開的線程數就越小。
大家有什麼解決方案嗎?難道大家都沒遇過這個問題?我的設想是可能Linux初始每個進程(也就是tomcat開的線程)有一個初始大小,這應該是一個內核參數來的,應該把它調小就可以了,但我不知道怎樣去調。