似乎Proxool引起了死循环

时间:2017-02-15 13:31:08

标签: java multithreading proxool

今天我有一个应用程序,它使用了近100%的CPU资源。我做了一些线程转储。发现:

"resin-port-8080-284" daemon prio=10 tid=0x00002ad370261000 nid=0x79c5 runnable [0x00002ad30b32d000]
    java.lang.Thread.State: RUNNABLE
    at java.util.HashMap.getEntry(HashMap.java:465)
    at java.util.HashMap.get(HashMap.java:417)
    at org.logicalcobwebs.proxool.proxy.InvokerFacade.getConcreteMethod(InvokerFacade.java:38)
    at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:111)
    at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87)
    at $java.lang.AutoCloseable$$EnhancerByProxool$$66bad385.getWarnings(<generated>)
    at org.hibernate.util.JDBCExceptionReporter.logAndClearWarnings(JDBCExceptionReporter.java:45)
    at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:472)
    at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
    at org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
    at org.hibernate.impl.SessionImpl.close(SessionImpl.java:335)

HashMap中的链表应该有一个循环链,因此CPU会继续运行并占用所有资源。

Proxool版本为0.9.0RC3,Java为1.7。

所以我不知道为什么会这样?大多数时候应用程序都可以。从源代码中,相关的Proxool类似乎是线程安全的。

是Proxool的错误吗?

1 个答案:

答案 0 :(得分:0)

InvokerFacade类有一个静态HashMap,并且在没有同步的情况下对其进行变异。

HashMap documentation明确指出:

  

如果多个线程同时访问哈希映射,并且至少有一个   线程的结构修改地图,必须同步   外部

这是一个缺陷,可能导致各种奇怪的行为,包括你在这里观察到的行为。

Explain the timing causing HashMap.put() to execute an infinite loop

Infinite loop in java.util.HashMap