SpringBoot 線上服務(wù)假死,CPU 內(nèi)存正常,什么情況?
閱讀本文大概需要 5?分鐘。
來(lái)自:blog.csdn.net/zhangcongyi420/article/details/131139599
背景

問題排查
常規(guī)排查
top?-H?-p?pid
或
ps?-mp?pid?-o?THREAD,tid,time
printf?“%x\n”?nid
jstack?pid?|?grep?number
jmap?-histo?pid|head?-100
jstack?-l?PID?>>?a.log
jmap?-dump:live,format=b,file=/dump.bin?pid
Shallow Size:表示對(duì)象自身占用的內(nèi)存大小,不包括它引用的對(duì)象。Retained size:當(dāng)前對(duì)象內(nèi)存大小+當(dāng)前對(duì)象直接或間接引用的對(duì)象大小,全部的總和,簡(jiǎn)單理解,就是當(dāng)前對(duì)象被GC后,總共能釋放的內(nèi)存大小。

Window->Preferences選擇最后一項(xiàng),點(diǎn)擊Apply and Close
本次問題排查
jstack?-l?PID?>>?a.log
RUNNABLE?線程運(yùn)行中或I/O等待BLOCKED?線程在等待monitor鎖(synchronized關(guān)鍵字)TIMED_WAITING?線程在等待喚醒,但設(shè)置了時(shí)限WAITING?線程在無(wú)限等待喚醒
"http-nio-8888-exec-6666"?#8833?daemon?prio=5?os_prio=0?tid=0x00001f2f0016e100?nid=0x667d?waiting?on?condition?[0x00002f1de3c5200]
java.lang.Thread.State:?WAITING?(parking)
at?sun.misc.Unsafe.park(Native?Method)
-?parking?to?wait?for??<0x00000007156a29c8>?(a?java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at?java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at?java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at?com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1897)
at?com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1458)
at?com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1253)
at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)
at?com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)
at?com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)
at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1231)
at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1223)
at?com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)
at?com.baomidou.dynamic.datasource.ds.ItemDataSource.getConnection(ItemDataSource.java:56)
at?com.baomidou.dynamic.datasource.ds.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:48)
at?org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at?org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at?org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)
at?org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)
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.$Proxy571.query(Unknown?Source)
??at?java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
??at?com.alibaba.druid.pool.DruidDataSource.takeLast(DruidDataSource.java:1897)
DruidConnectionHolder?takeLast()?throws?InterruptedException,?SQLException?{
try?{
while?(poolingCount?==?0)?{
emptySignal();?//?send?signal?to?CreateThread?create?connection
??????????????if?(failFast?&&?isFailContinuous())?{
??????????????????throw?new?DataSourceNotAvailableException(createError);
??????????????}
??????????????notEmptyWaitThreadCount++;
??????????????if?(notEmptyWaitThreadCount?>?notEmptyWaitThreadPeak)?{
??????????????????notEmptyWaitThreadPeak?=?notEmptyWaitThreadCount;
??????????????}
??????????????try?{
??????????????????//?數(shù)據(jù)庫(kù)的連接都沒有釋放且被占用,連接池中無(wú)可用連接,導(dǎo)致請(qǐng)求被阻塞
??????????????????notEmpty.await();?//?signal?by?recycle?or?creator
??????????????}?finally?{
??????????????????notEmptyWaitThreadCount--;
??????????????}
??????????????notEmptyWaitCount++;
??????????????if?(!enable)?{
??????????????????connectErrorCountUpdater.incrementAndGet(this);
??????????????????throw?new?DataSourceDisableException();
??????????????}
??????????}
??????}?catch?(InterruptedException?ie)?{
??????????notEmpty.signal();?//?propagate?to?non-interrupted?thread
??????????notEmptySignalCount++;
??????????throw?ie;
??????}
??????decrementPoolingCount();
??????DruidConnectionHolder?last?=?connections[poolingCount];
??????connections[poolingCount]?=?null;
??????return?last;
}
try?{
??SqlSession?sqlSession?=?sqlSessionFactory.openSession(ExecutorType.BATCH);
??TestMapper?mapper?=?sqlSession.getMapper(TestMapper.class);
??mapper.insetList(list);
??sqlSession.flushStatements();
}?catch?(Exception?e)?{
???e.printStackTrace();
}
問題復(fù)現(xiàn)

server.tomcat.max-threads=200
server.tomcat.max-connections=10000
server.tomcat.accept-count=100
server.tomcat.min-spare-threads=100



解決
spring:?
??redis:
????host:?localhost
????port:?6379
????password:?
??datasource:
????druid:
??????stat-view-servlet:
????????enabled:?true
????????loginUsername:?admin
????????loginPassword:?123456
????dynamic:
??????druid:
????????initial-size:?5
????????min-idle:?5
????????maxActive:?20
????????maxWait:?60000
????????timeBetweenEvictionRunsMillis:?60000
????????minEvictableIdleTimeMillis:?300000
????????validationQuery:?SELECT?1?FROM?DUAL
????????testWhileIdle:?true
????????testOnBorrow:?false
????????testOnReturn:?false
????????poolPreparedStatements:?true
????????maxPoolPreparedStatementPerConnectionSize:?20
????????filters:?stat,slf4j,wall
????????connectionProperties:?druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
sqlSession.close();
推薦閱讀:
美團(tuán)一面:MyBatis 的 3 種分頁(yè),還有誰(shuí)不會(huì)?
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?


