2016-08-17 3 views
0

한 때 가비지 컬렉터 실행을 지워집니다 때문에아파치 beanutils 내 생산 응용 프로그램의

Waiting for Monitor Lock on org/apache/commons/beanutils/[email protected] 

Beanutils 컨버터 및지도의 항목의 매핑을 관리 할 수의 WeakHashMap를 사용하여 차단 된 스레드의 수가 점점 잠급니다. WeakFastHashMap.put() 메서드 내의 코드가 인이에 동기화되어 스레드가 차단되는 것으로 보입니다.

at org/apache/commons/beanutils/WeakFastHashMap.put(WeakFastHashMap.java:249(Compiled Code)) 
at org/apache/commons/beanutils/ConvertUtilsBean.register(ConvertUtilsBean.java:873(Compiled Code)) 
at org/apache/commons/beanutils/ConvertUtilsBean.register(ConvertUtilsBean.java:786(Compiled Code)) 
at org/apache/commons/beanutils/ConvertUtilsBean.registerArrayConverter(ConvertUtilsBean.java:781(Compiled Code)) 
at org/apache/commons/beanutils/ConvertUtilsBean.registerArrays(ConvertUtilsBean.java:745(Compiled Code)) 
at org/apache/commons/beanutils/ConvertUtilsBean.register(ConvertUtilsBean.java:605(Compiled Code)) 

이것은 임의로 발생하며 높은 CPU를 발생시키고 gc주기 간의 시간 간격을 줄입니다. 이것을 처리하는 가장 좋은 방법은 무엇입니까?

사용되는 Beanutils 버전은 1.8.0입니다. 이를 생성하는 코드 줄은 다음과 같습니다 프로젝트에서 사용

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0); 

다른 프레임 워크는 뉴저지 1.8과 스프링 3.1 그리고 4.2를 최대 절전 모드.

+0

자세한 정보를 제공해 주시겠습니까? 어떤 애플리케이션 프레임 워크를 사용하고 있는지, 어떻게 'ConvertUtilsBean'을 생성하는지, 어디에서나 생성 한'ConvertUtilsBean'을 저장하고 있는가? 기타 – Brian

+0

질문에 추가되었습니다. –

답변

0

이 동작은 응용 프로그램의 각 스레드에서 register 메서드를 호출 할 때 발생하며, 클래스 로더 스레드 당 한 번 레지스터를 호출해야합니다.

참조 용 유사 주제 확인 : Performance of BeanUtils vs. ReflectionToStringBuilder (for use in Bean classes).

우리는 동일한 문제를 가지고 있으며 지금까지 이것이 우리가 식별 할 수 있었던 유일한 근본 원인입니다.