获取Threaddump java.lang.Thread.State:在org.hsqldb.Session.setAutoCommit(未知源)上被阻止(在对象监视器上)

获取Threaddump java.lang.Thread.State:在org.hsqldb.Session.setAutoCommit(未知源)上被阻止(在对象监视器上),java,garbage-collection,Java,Garbage Collection,我们正在我的SQL数据库中使用Struts2应用程序。 几个月后,我们得到Java线程转储,应用程序停止响应 线程转储如下所示: “http-0.0.0-8443-98”守护进程prio=10 tid=0x000000004322900 nid=0x54正在等待监视器条目[0x00007f8b3b8b0000] java.lang.Thread.State:阻塞(在对象监视器上) 位于org.hsqldb.Session.setAutoCommit(未知源) “http-0.0.0-8443-1

我们正在我的SQL数据库中使用Struts2应用程序。 几个月后,我们得到Java线程转储,应用程序停止响应

线程转储如下所示: “http-0.0.0-8443-98”守护进程prio=10 tid=0x000000004322900 nid=0x54正在等待监视器条目[0x00007f8b3b8b0000] java.lang.Thread.State:阻塞(在对象监视器上) 位于org.hsqldb.Session.setAutoCommit(未知源)

“http-0.0.0-8443-179”守护进程prio=10 tid=0x00007f8b3015c000 nid=0x571f等待监视器条目[0x00007f8b2faf9000] java.lang.Thread.State:阻塞(在对象监视器上) 位于org.apache.tomcat.util.net.JIoEndpoint.recycleWorkerThread(JIoEndpoint.java:724)

对象中的“http-0.0.0-8443-175”守护进程prio=10 tid=0x00007f8b30163800 nid=0x5713。等待()[0x00007f8b3443b000] java.lang.Thread.State:正在等待(在对象监视器上) 在java.lang.Object.wait(本机方法)

“Task-Thread-for-com.mchange.v2.async。ThreadPerTaskAsynchronousRunner@2d2fa195“守护进程prio=10 tid=0x000000005a06b800 nid=0x5631正在等待监视器条目[0x00007f8b34c4b000] java.lang.Thread.State:阻塞(在对象监视器上) 位于org.hsqldb.DatabaseManager.getDatabase(未知源)

“http-0.0.0-8443-127”守护进程prio=10 tid=0x000000005c334800 nid=0x54e0等待监视器条目[0x00007f8b37c76000] java.lang.Thread.State:阻塞(在对象监视器上) 位于org.hsqldb.Session.execute(未知源)

“DefaultQuartzScheduler_Worker-3”优先级=10 tid=0x00007f8b714d4000 nid=0x5ac6等待监视器输入[0x00007f8bed917000] java.lang.Thread.State:阻塞(在对象监视器上) 在com.octopus.scheduler.tasks.SyncCertificateActivationThreads.activate上(SyncCertificateActivationThreads.java:62)

对于数据库,我们使用

public class ConnectionManager {

/* Object stores the value of lock */
private static final Object lock = new Object();

/**
 * This method is used to get connection object holding the connection with
 * the database. This connection object is created using
 * 
 * @return Connection
 */
public Connection getDBConnection() {

    Connection conn = null;
    try {
        InitialContext initialContext = new InitialContext();

        IEntityManager manager = new EntityManager();

        String dataSource = manager.getDatsourceInstance(application,
                coreProduct);
        DataSource ds = (DataSource) initialContext.lookup("java:"
                + dataSource);

        if (ds != null) {
            conn = ds.getConnection();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return conn;
}

/**
 * This method is use to generate the random id.
 * 
 * @return
 */
public String generateId() {
    return UUID.randomUUID().toString().substring(0, 13);
}

/**
 * This method is use to generate the id which contains the current system
 * time.
 * 

 */
public synchronized String generateNewId() {
    String id = "";
    synchronized (lock) {
        // id = String.valueOf(System.currentTimeMillis());
        id = String.valueOf(System.nanoTime());
    }
    return id;
}

由于这些应用程序停止运行,需要哪些参数、标准和配置来减少此类转储。

我们也在使用ParallelGC StrategyNote,仅仅因为您将
System.nanoTime()
放在
synchronized
中,并不能保证下一次执行将读取不同的值。它仍可能在计时器的粒度范围内发生。除此之外,您发布的内容并没有太大帮助,因为此代码没有直接涉及到发布的堆栈跟踪(或者在您切断的部分中)。看起来像是死锁,但您没有包括显示所属监控器的部分。