【问题标题】:It seems that Proxool caused a dead loop似乎 Proxool 造成了死循环
【发布时间】:2017-02-15 13:31:07
【问题描述】:

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

【问题讨论】:

    标签: java multithreading proxool


    【解决方案1】:

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

    HashMap documentation 明确指出:

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

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

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

    Infinite loop in java.util.HashMap

    【讨论】:

    • 是的,看看InvokerFacade 代码,它不是线程安全的。但我不确定使用InvokerFacade 的类是否对并发访问有充分的保护。
    • 有证据表明他们没有。事实上,通过使用静态变量,外部同步变得不切实际。
    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多