1

我最近遇到了三个运行相同代码的独立服务器都遇到相同症状的问题。这些是使用 json-lib 创建 JSON 响应的大容量 REST / JSON 服务器。服务器最终都会挂起,大多数线程都在等待一个特定的锁。持有该锁的线程都具有相同的基本外观:

 "TP-Processor204" daemon prio=10 tid=0x00002aac40d85000 nid=0x6978 waiting for monitor entry [0x000000004dec8000] 
    java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.commons.beanutils.BeanUtilsBean.getInstance(BeanUtilsBean.java:78)
        - locked <0x00002aaab230f970> (a java.lang.Class for org.apache.commons.beanutils.BeanUtilsBean)
        at org.apache.commons.beanutils.PropertyUtilsBean.getInstance(PropertyUtilsBean.java:101)
        at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290)
        at net.sf.json.JSONObject._fromBean(JSONObject.java:918)
        at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
        at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
        at net.sf.json.JSONArray._processValue(JSONArray.java:2514)
        at net.sf.json.JSONArray.processValue(JSONArray.java:2539)
        at net.sf.json.JSONArray.addValue(JSONArray.java:2526)
        at net.sf.json.JSONArray._fromCollection(JSONArray.java:1057)
        at net.sf.json.JSONArray.fromObject(JSONArray.java:123)
        at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:237)
        at net.sf.json.JSONObject._processValue(JSONObject.java:2808)

这是该线程持有的唯一锁。我尝试过简单地在谷歌上搜索监视器条目值所指的内容,但没有任何运气。对于这个线程,值 [0x000000004dec8000] 似乎没有引用对象 ID,并且它没有出现在堆栈跟踪中的其他任何地方。

我在这里发现了完全相同的问题,没有答案,而这个较旧的 SO 问题说这是一个 JVM 错误,是由于未将监视器正确分配给其中一个等待线程而引起的。我不完全确定我理解如何将线程标记为锁定监视器但实际上并没有给出监视器,但是这些操作可能是分开的并且 JVM 中的错误在分配锁后会导致问题是有道理的,但是在分配监视器之前(尽管我一直认为它们是同一件事)。

我使用的java版本是:

java 版本“1.6.0_18”Java(TM) SE 运行时环境(构建 1.6.0_18-b07)Java HotSpot(TM) 64 位服务器 VM(构建 16.0-b13,混合模式)

在:

CentOS release 5.2 (Final) 内核版本:2.6.18-194.17.4.el5xen

这真的只是一个 JVM 错误还是我应该研究的其他东西?

编辑:

我们使用的 commons-beanutils 版本是 1.7。我们已经升级到 1.8,看看它是否能解决问题。

4

1 回答 1

0

这似乎与此错误有关

https://issues.apache.org/jira/browse/BEANUTILS-49

首次加载类时,加载和静态块是线程安全的。如果加载类时出现问题,这并不总是很明显。

于 2011-09-20T20:37:26.657 回答