jvm调优:能生成的线程数
轉載自:http://blog.sina.com.cn/s/blog_684fe8af0100wzge.html
?
windows機器(32位的 )上調試一個代碼的時候報了一個如下錯誤
?
Java代碼 ??
第一眼看上去是OOM,有點傻眼,因為我的內存啟動參數是“-Xms1024m -Xmx1024m -Xss45m”,而我很清楚這個代碼大概的內存消耗。奇怪的是進程還沒退出,于是打開visualvm監控了一下,發現heap空間還有大量剩余。
?
于是把目光焦點放在了“unable to create new native thread.” 。
jvm 堆和棧內存還完全夠用的情況下,出現OOM,是第一次注意(也許以前潛意識里,OOM肯定是heap或perm空間不夠用了)。之前沒分析這類錯誤,通過google大神,大概了解了一下錯誤所以在此記錄一下。
?
大概的原因如下:
當我們在jvm里創建一個線程的時候同樣會在OS里創建一個本地線程,本地線程使用的是進程最大空間里且是JVM之外的內存。一個本地線程的線程棧空間剛好是我們jvm里指定的Xss。
由此,網上查到的最大可創建線程數公式是:
(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory:進程最大尋址空間。
JVMMMEMORY:jvm的內存空間(堆+永久區)
ReservedOsMemory:操作系統預留內存
ThreadStackSize:XSS大小。
?
剛好本人這個啟動參數里把Xss設置程了45m(因為有遞歸且不缺定深度),所以如果預估ReservedOsMemory是100的情況,可以創建的線程數量如下:
(2G-1024m-100m)/45m=20.
而本程序里需要創建的線程是不止20的,也難怪會爆出這個異常了。
后面本人通過修改Xss的參數,問題得到解決。
網上也有說有其他的方式來避免,沒有細細探究,高手可以出來拍磚。如果分析有錯誤之處,也請高手也可以出來拍拍磚。
?
另外我在本人64位的開發機賞試了下,-Xms1024m -Xmx1024m -Xss200m參數下開了幾百個線程也沒問題,不知道公式對不對,有說64位機器的進程最大內存空間是4G,如果真的是4G,顯然不能創建這么多的。
?
?
另外補充以下幾個OOM的類型:
1. java.lang.OutOfMemoryError: Java heap space? 堆空間不足
2. java.lang.OutOfMemoryError: PermGen space?? 永久區不足
3. java.lang.OutOfMemoryError: Requested array size exceeds VM limit
4. java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)
?
參考
http://www.openkb.org/java-out-of-memory-unable-to-create-new-native-thread/
http://www.blogjava.net/ldd600/archive/2009/09/25/296397.html
總結
以上是生活随笔為你收集整理的jvm调优:能生成的线程数的全部內容,希望文章能夠幫你解決所遇到的問題。