今天我有一个应用程序,它使用了近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的错误吗?
答案 0 :(得分:0)
InvokerFacade类有一个静态HashMap,并且在没有同步的情况下对其进行变异。
HashMap documentation明确指出:
如果多个线程同时访问哈希映射,并且至少有一个 线程的结构修改地图,必须同步 外部
这是一个缺陷,可能导致各种奇怪的行为,包括你在这里观察到的行为。
Explain the timing causing HashMap.put() to execute an infinite loop