解決OutOfMemoryError: unable to create new native thread

問題

生產環(huán)境springboot工程卡死入愧,檢查日志發(fā)現了以下問題:

Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 20
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:84)
    at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:70)
    at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:143)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
    at com.sun.proxy.$Proxy109.query(Unknown Source)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    ... 34 common frames omitted
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 20
    at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1265)
    at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1086)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
    at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:670)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540)
    at com.alibaba.druid.filter.FilterAdapter.dataSource_getConnection(FilterAdapter.java:2723)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1064)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1056)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:104)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 46 common frames omitted
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:717)
    at java.util.Timer.<init>(Timer.java:176)
    at org.postgresql.util.SharedTimer.getTimer(SharedTimer.java:45)
    at org.postgresql.jdbc.PgConnection.getTimer(PgConnection.java:1165)
    at org.postgresql.jdbc.PgConnection.addTimerTask(PgConnection.java:1178)
    at org.postgresql.jdbc.PgStatement.startTimer(PgStatement.java:889)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:429)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:303)
    at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:289)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:266)
    at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:233)
    at com.alibaba.druid.pool.vendor.PGValidConnectionChecker.isValidConnection(PGValidConnectionChecker.java:65)
    at com.alibaba.druid.pool.DruidAbstractDataSource.validateConnection(DruidAbstractDataSource.java:1290)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1535)
    at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2100)

分析原因

可能的原因

OutOfMemoryError: unable to create new native thread出現的情況有兩種:

  1. 服務器剩余內存不足(非JVM內存)卷中,不能創(chuàng)建新的線程
    能創(chuàng)建的線程數的具體計算公式如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory         指的是一個進程的最大內存
JVMMemory                JVM內存
ReservedOsMemory         保留的操作系統(tǒng)內存
ThreadStackSize          線程棧的大小
  1. 超出服務器用戶最大進程限制:
    通過以下命令可以查看(注意澈魄,不同用戶,最大進程限制配置可能不一樣):
ulimit -u
image.png

參考資料:
https://blog.csdn.net/thwsir/article/details/86480956
https://www.cnblogs.com/svennee/p/4331549.html
https://blog.csdn.net/qq171563857/article/details/94590992

分析

通過檢查jvm參數窟她,發(fā)現沒有設置-Xss纳账,使用的默認大小兄旬,其次幅聘,使用free -m查看服務器可用內存凡纳,發(fā)現還有很多剩余,懷疑是超出服務器用戶最大進程限制帝蒿,由于需要先修復生產環(huán)境荐糜,沒有過多時間分析定位錯誤,只保留了日志以及設置了用戶的最大進程數葛超,就重啟了工程暴氏。

事后模擬

  1. 在java工程中定義一個http接口,當調用時绣张,不停的創(chuàng)建和啟動線程答渔。
@GetMapping("/testThread")
    public void testThread() {
        List<Thread> list = new ArrayList<>();
        while(true) {
            Thread t = new Thread(() -> {
                try {
                    Thread.sleep(600000L);
                } catch (InterruptedException e) {
                    log.error("###",e);
                }
            });
            t.start();
            list.add(t);
            log.info(String.valueOf(list.size()));
        }
    }
  1. 設置服務器java用戶的最大進程數量1000個。

    image.png

  2. 在服務器啟動java工程侥涵,并調用測試線程接口研儒,成功模擬了生產異常。

image.png
  1. 通過pstree查看java工程的線程數量
pstree -p java進程id | wc -l
image.png

修復

在文件/etc/security/limits.d/20-nproc.conf調整用戶的最大進程數

*          soft    nproc     4096
java       soft    nproc     1000
root       soft    nproc     unlimited

說明:
root用戶無限制
java用戶1000個
其他用戶4096個

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末独令,一起剝皮案震驚了整個濱河市端朵,隨后出現的幾起案子,更是在濱河造成了極大的恐慌燃箭,老刑警劉巖冲呢,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異招狸,居然都是意外死亡敬拓,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門裙戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乘凸,“玉大人,你說我怎么就攤上這事累榜∮冢” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵壹罚,是天一觀的道長葛作。 經常有香客問我,道長猖凛,這世上最難降的妖魔是什么赂蠢? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮辨泳,結果婚禮上虱岂,老公的妹妹穿的比我還像新娘玖院。我一直安慰自己,他們只是感情好第岖,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布司恳。 她就那樣靜靜地躺著,像睡著了一般绍傲。 火紅的嫁衣襯著肌膚如雪扔傅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天烫饼,我揣著相機與錄音猎塞,去河邊找鬼。 笑死杠纵,一個胖子當著我的面吹牛荠耽,可吹牛的內容都是我干的。 我是一名探鬼主播比藻,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼铝量,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了银亲?” 一聲冷哼從身側響起慢叨,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎务蝠,沒想到半個月后拍谐,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡馏段,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年轩拨,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院喜。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡亡蓉,死狀恐怖,靈堂內的尸體忽然破棺而出喷舀,到底是詐尸還是另有隱情砍濒,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布元咙,位于F島的核電站梯影,受9級特大地震影響巫员,放射性物質發(fā)生泄漏庶香。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一简识、第九天 我趴在偏房一處隱蔽的房頂上張望赶掖。 院中可真熱鬧感猛,春花似錦、人聲如沸奢赂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膳灶。三九已至咱士,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轧钓,已是汗流浹背序厉。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毕箍,地道東北人弛房。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像而柑,于是被迫代替她去往敵國和親文捶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容