記一次tomcat線程創建異常調優:unable to create new native thread

来源:http://www.cnblogs.com/5207/archive/2016/10/24/5992873.html
-Advertisement-
Play Games

測試在進行一次性能測試的時候發現併發300個請求時出現了下麵的異常: HTTP Status 500 - Handler processing failed; nested exception is java.lang.OutOfMemoryError: unable to create new n ...


測試在進行一次性能測試的時候發現併發300個請求時出現了下麵的異常:

HTTP Status 500 - Handler processing failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread

看到這個異常有點發慌,畢竟併發程式寫的少,突然來這麼一個確實有點找不著背。但不管怎麼樣還是先搜索一下是啥原因吧。

這個錯誤是因為無法再創建新線程導致的,原因可能是沒有更多的空間用於創建線程,還有一個公式用來計算:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

這其中各個參數的意思是:
MaxProcessMemory:進程最大定址空間。
JVMMMEMORY:jvm的記憶體空間(堆+永久區)-Xmx大小 (應該是實際分配大小)
ReservedOsMemory:操作系統預留記憶體
ThreadStackSize:-Xss大小

懶得寫了,找一篇參考:https://my.oschina.net/xinxingegeya/blog/744462

於是我查看一下liunx系統的參數情況:

[root@RHEL63temp ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63628
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

其中的max user processes只有1024個,心想著這事情可能問題不在於創建的限制,而是為什麼要創建這麼多線程?畢竟只有300個併發,tomcat最多也就300個線程用於處理請求吧?

於是想了想程式代碼的問題,還是要從代碼上去查找原因。於是臨時開始研究了一下JVisualVM這個監控工具,在伺服器上做了做配置,反正網上有教程。因為我使用的是Tomcat,所以直接就監控Tomcat吧,在catalina.sh中增加一些參數:

JAVA_OPTS="-server -Xmx384m -Xms128m -XX:PermSize=128M -XX:MaxPermSize=256m"
	-Dcom.sun.management.jmxremote.port=9998 
	-Dcom.sun.management.jmxremote.ssl=false 
	-Dcom.sun.management.jmxremote.authenticate=false 
	-Djava.rmi.server.hostname=192.168.49.199"

這樣就可以使用JVisualVM通過JMX方式監控了。連接上後再進行測試問題原因找到了。

線程產生這麼大主要是兩塊:
1、tomcat的本身需要支持併發的線程
2、smack產生的大量線程,而且連續壓測會發現smack的線程出現不釋放的情況

這裡的關鍵是smack的使用,因為系統實現了一個功能就是通過網頁發起ajax請求,然後在服務端模擬即時通過用戶發送消息。因為併發300個請求,導致每個請求都要創建smack的連接,而smack是用於客戶端開發的庫,啟動後會創建3個左右的線程用於連接和處理伺服器的通訊。這就導致同時會產生300*3的線程,所以併發時會所線程創建數用滿。

既然問題原因找到了,所以這裡的問題可能還是smack的使用問題,畢竟smack是個客戶端庫,不太適合於這種服務端的場景。

解決方法是使用其他方式代替smack發消息,這樣只需要創建少量的線程就可以滿足要求,而且處理速度大大提升。

 

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接! 若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝! http://www.cnblogs.com/5207
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#學習中的一些演算法排序,不完整, @^_^@ 2016-10-23 ****************************************************************************************** 1.冒泡排序 是將對數組相鄰的元素進行比較,將最 ...
  • 文檔目錄 本節內容: 簡介 關於ISettingStore 定義設置 setting scope(設置範圍) 重寫設置定義 獲取設置值 服務端 客戶端 修改設置 關於緩存 關於ISettingStore setting scope(設置範圍) 重寫設置定義 服務端 客戶端 簡介 每個應用必需存儲一些 ...
  • 在Common中新建一個CookieHelper,全局調用 ...
  • 隨著項目深入,需要移植到安卓上,問題來了,QML安卓適配! 幸好PC端程式和手機屏幕長寬比例相似。雖然單位像素,尺寸不同,通過比例縮放,可以實現組件PC和安卓通用代碼。 第一步:定義全局的轉換函數(300,500是你的PC端設計尺寸) 第二步:將所有相關尺寸的都通過上面的轉換函數計算新值 第三步:對 ...
  • php採集神器CURL使用方法詳解 php採集神器CURL使用方法詳解 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 作者:佚名 更新時間:2016-10-21 對於做過數據採集的人來說,cURL一定不會陌生。雖然在PHP中有file_get_content ...
  • 首先我們要JavaWeb登陸的基本流程:JSP頁面發送請求——>Servlet——>Servlet通過調用方法從資料庫中得到數據並將結果返回頁面 我們先建立三個jsp頁面,包括login.jsp(登陸頁面)、index.jsp(顯示登陸成功後的信息)、error.jsp(登錄失敗的頁面),其中後兩個 ...
  • 1 概述 在進行ESB集成項目中,使用到了很多系統的介面,這些介面傳輸的數據大部分都採用了XML的格式,這樣在使用ESB開發服務時就需要對XML數據進行解析或拼接的操作,本文以項目中流程服務為例,講解一些常用的Dom4j對XML的操作。 2 名詞解釋 Dom4j:一個Java的XML API,用來讀 ...
  • 做python項目,需要用到mysql,一般用python-mysql,安裝時遇到錯誤提示如下: Command "python setup.py egg_info" failed with error code 1 Trace的關鍵信息是:sh: mysql_config: command not ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...