...
- parking to wait for <0x00000000ec01f3a8> (a java.util.concurrent.FutureTask$Sync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1011)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1303)
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:227)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at smartbi.connectionpool.ConnectionPool$7.validateConnection(ConnectionPool.java:662)
at org.apache.commons.dbcp.PoolableConnectionFactory.validateObject(PoolableConnectionFactory.java:308)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:855) - locked <0x00000000ca80cae0> (a smartbi.connectionpool.ConnectionPool$5)
at smartbi.connectionpool.ConnectionPool$5.borrowObject(ConnectionPool.java:504)
at org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:175)
at smartbi.connectionpool.ConnectionPool.driverConnect(ConnectionPool.java:216)
at smartbi.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:354)
at smartbi.freequery.querydata.store.DBSQLResultStore.executeInDatabase(DBSQLResultStore.java:1343) - locked <0x00000000ebffd8b0> (a smartbi.freequery.querydata.store.DBSQLResultStore)
at smartbi.freequery.querydata.store.DBSQLResultStore.ensureGridDataInMemDB(DBSQLResultStore.java:4422)
at smartbi.freequery.querydata.store.DBSQLResultStore.getGridDataInternal(DBSQLResultStore.java:3825)
at smartbi.freequery.querydata.store.SQLResultStore.getGridData(SQLResultStore.java:156)
at smartbi.freequery.report.SimpleReportBO.getGridDataInternal(SimpleReportBO.java:1005) - locked <0x00000000eacb6600> (a smartbi.freequery.report.SimpleReportBO)
at smartbi.freequery.report.SimpleReportBO.getGridData(SimpleReportBO.java:981) locked <0x00000000eacb6600> (a smartbi.freequery.report.SimpleReportBO)
2.连接池满
线程信息中出现大量在执行含GenericObjectPool.borrowObject的线程的(意味着好多操作在等待获取连接),代表连接池满了,具体的线程信息类似如下:
"http-bio-8072-exec-41" daemon prio=6 tid=0x0000000010600000 nid=0x3588 in Object.wait() [0x0000000020f8d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:810)
- locked <0x00000000f93cdf60> (a smartbi.connectionpool.ConnectionPool$5)
at smartbi.connectionpool.ConnectionPool$5.borrowObject(ConnectionPool.java:504)
at org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:175)
at smartbi.connectionpool.ConnectionPool.driverConnect(ConnectionPool.java:216)
at smartbi.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:354)
at smartbi.freequery.querydata.store.DBSQLResultStore.executeInDatabase(DBSQLResultStore.java:1343) locked <0x00000000f4ae85e0> (a smartbi.freequery.querydata.store.DBSQLResultStore)
at smartbi.freequery.querydata.store.DBSQLResultStore.ensureGridDataInMemDB(DBSQLResultStore.java:4422)
at smartbi.freequery.querydata.store.DBSQLResultStore.getGridDataInternal(DBSQLResultStore.java:3825)
at smartbi.freequery.querydata.store.SQLResultStore.getGridData(SQLResultStore.java:156)
这时在监控界面看到连接池active的个数和数据源设置的大小是一样的。
这时需要在系统一重启时,在"系统运维">"调试工具集">" 连接池信息"启动跟踪。
连接数据到一半或以上时刷新页面分析获取数据库连接的代码来源。
3.对象池满
线程中出现如下内容时通常是对象池被使用满了
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000c396d7b8> (a smartbi.pool.BusinessViewBOPool)
at java.lang.Object.wait(Object.java:485)
at smartbi.pool.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:839) - locked <0x00000000c396d7b8> (a smartbi.pool.BusinessViewBOPool)
at smartbi.pool.BaseSmartbiObjectPool.borrowObject(BaseSmartbiObjectPool.java:148) - locked <0x00000000c396d7b8> (a smartbi.pool.BusinessViewBOPool)
at smartbi.pool.BusinessViewBOPool.borrowObject(BusinessViewBOPool.java:47) locked <0x00000000c396d7b8> (a smartbi.pool.BusinessViewBOPool)
这时需要在系统一重启时,在"系统运维">"调试工具集">" 对象池信息"启动跟踪。
对象池个数到一半或以上时刷新页面分析获取对象池的代码来源。
4.死锁
当线程出现相互等待时,就是代码出现死锁了
"pool-2-thread-2":
at smartbi.xxx(xxx.java:1)
- waiting to lock <lockid1> (a smartbi.xxx)
at smartbi.xxx(xxxxx.java:138) - locked < lockid2> (a smartbi.xxx)
"pool-3-thread-3":
at smartbi.xxx(xxx.java:999) - waiting to lock <lockid2> (a smartbi.xxx)
at smartbi.xxx(xxxxx.java:234) locked < lockid1> (a smartbi.xxx)
这找到对应代码查看其synchronized对象是否一致。 以下是可以产生死锁的代码
Class A {
Void a() {
Synchronized(B.class) {
Synchronized(C.class) { }
}
}
Void b() {
Synchronized(C.class) {
Synchronized(B.class) { }
}
}
}5.其他问题
在采用了上面方法,都没确认问题时,接下来只能一一查看每个线程的具体执行逻辑内容,判断其正在处理的逻辑,这需要熟悉代码。
附上线程分析的工具ThreadAnalyzer的使用帮助,点击其中的常用工具>ThreadAnalyzer的使用帮助,点击其中的常用工具>ThreadAnalyzer,该工具可以很方便的看出锁等待及死锁问题。