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를 나타내는 것으로 보이지 않으며 스택 추적의 다른 곳에서는 나타나지 않습니다.

대답이없는 exact same issue here이 발견되었고이 older SO question은 대기중인 스레드 중 하나에 모니터를 올바르게 지정하지 않아서 발생하는 JVM 버그라고합니다. 나는 스레드가 모니터를 잠글 수 있지만 실제로는 모니터를 제공하지 않는 것으로 이해할 수 있다는 것을 완전히 확신 할 수는 없지만 그러한 조작이 분리되어있을 수 있으며 JVM의 버그로 인해 잠금을 할당 한 후에 문제가 발생하지만 모니터를 할당하기 전에 (비록 나는 항상 같은 것을 생각했다.).

내가 사용 Java 버전은 다음과 같습니다

자바 버전 "1.6.0_18" 자바 (TM) SE 런타임 환경 자바 핫스팟 (TM) 64 비트 서버 (1.6.0_18-B07를 구축) 2.6.18-194.17.4.el5xen

이 정말로 단지 JVM 버그가 :

에 CentOS 5.2 (최종) 커널 버전을 출시 : VM

에 (16.0-B13, 혼합 모드를 구축) 또는 뭔가 전자가있다. 내가 조사해야한다고?

편집 :

우리가 사용하고 있던 평민 - beanutils 버전은 1.7이었다. 이후 1.8으로 업그레이드하여 문제가 해결되는지 확인합니다.

+0

JVM 버그가 의심되는 경우 Java 6 업데이트 최신 버전을 사용하여 버그가 수정되었는지 확인하는 것이 가장 좋습니다. 지난 8 번의 업데이트에서이 버전에는 여러 가지 JVM 개선 사항이 있습니다. –

+0

확실히 할 수 있습니다. 나는 또한 그 결과를 해석하는 방법을 이해하는데 더 관심이있다. 그게 비 관능적 인 스택 추적 (JVM 버그를 암시하는)인가, 아니면 정확하게 읽는 법을 이해할 수 없는가? – dlawrence

+0

클래스로드를 기다리는 것이 항상 스택 추적에 표시되는 것은 아닙니다. –

답변

0

이 처음 클래스를로드 할 때 버그

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

관련된 것으로 보인다 로딩 정적 블록 스레드 안전하다. 클래스를로드하는 데 문제가있는 경우 이것이 항상 명확하지는 않습니다.

+0

마지막 부분을 잘 모르겠다. 로드 및 정적 블록이 스레드로부터 안전하지 않다는 것을 의미합니까? – dlawrence

+0

이 변경으로 인해 문제가 해결 된 것으로 보입니다. 따라서 스택 추적의 의미를 이해하는 데는 여전히 관심이 있지만 올바른 표시를 할 것입니다. – dlawrence

+0

클래스 로딩 및 정적 블록은 스레드로부터 안전하지만 객체를 잠그는 것과 같은 방법으로 잠긴 객체를 사용하거나 스택 추적에 나타날 수 없습니다. –

관련 문제