0

今天我有一个应用程序,它使用了接近 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 的错误吗?

4

1 回答 1

0

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

HashMap文档明确指出:

如果多个线程同时访问一个hash map,并且至少有一个线程在结构上修改了map,则必须对外同步

这是一个缺陷,可能导致各种奇怪的行为,包括您在此处观察到的情况。

解释导致 HashMap.put() 执行无限循环的时机

java.util.HashMap 中的无限循环

于 2017-02-15T13:36:24.260 回答