私は最近、同じコードを実行している 3 つの別々のサーバーですべて同じ症状が発生するという問題が発生しました。これらは、json-lib を使用して JSON 応答を作成する大量の REST / JSON サーバーです。最終的にはすべてのサーバーがハングし、ほとんどのスレッドが 1 つの特定のロックを待機します。すべてのロックを保持しているスレッドは、同じ基本的な外観を持っていました。
"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の質問は、モニターを待機中のスレッドの1つに適切に割り当てていないことが原因で発生した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 リリース 5.2 (最終版) カーネル バージョン: 2.6.18-194.17.4.el5xen
これは本当に単なる JVM のバグですか、それとも他に調べるべきことがありますか?
編集:
使用していた commons-beanutils のバージョンは 1.7 でした。その後、問題が解決するかどうかを確認するために 1.8 にアップグレードしました。