页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

  • 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,该工具可以很方便的看出锁等待及死锁问题。