2017-01-27 5 views
0

우리가 연결하려는 서비스에 WSSE 보안이 필요하기 때문에 스레드 안전하지 않기 때문에 응용 프로그램의 다른 클라이언트간에 포트 객체를 공유 할 수 없기 때문에 Apache CXF 클라이언트에 메모리 문제가 있습니다. 그래서 우리는 Apache Commons pool2를 사용하여 x 개의 이러한 객체를 풀링합니다. 우리 CXF 클라이언트가 연결하는 서비스는 매우 크고 복잡한 xml 객체를 반환하고 jProfiler를 사용하여 알아 차리는 것은 입니다. 우리가 풀링하는 포트 객체는 여전히 반환 된 복합 응답 객체를 참조합니다. 이는 우리가 메모리가 해제되지 않는 GC를 수행하십시오. 서비스가 사용 중이면 메모리 문제가 나타납니다. 먼저 CXF의 경우 정상이며 두 번째로 CXF에 이러한 참조에 매달리지 않고 자체를 정리하지 않도록 지시하는 방법이 있습니까?Apache CXF 클라이언트 메모리

풀 작성 후 응용 프로그램이 최대

{ 
    webServicesPT webServicesPT = clientPool.getPort(); // calls borrowObject() 

    try { 
     webServicesPT.service(); 
    } finally { 
     clientPool.returnPort(webServicesPT); // calls returnObject() 
    } 
} 

어떤 도움을 주시면 감사하겠습니다 시작할 때 우리가 포트를 사용하는 방법이있다 아주 기본적인 예를 들어

.

감사합니다.

답변

1

여기에 설명 된 문제와 정확히 동일합니다. 실제로 흥미로운 부분은 Apache CXF 라이브러리의 관점에서 모든 것이 논리적이라는 것입니다. 라이브러리는 WeakHashMap을 사용하여 responseContext를 저장합니다. 맵에 사용되는 키는 Thread 객체 자체입니다. 따라서 응용 프로그램이 스레드 풀을 사용하여 Application Server에서 실행되고 웹 서비스 호출이 다른 스레드에서 수행되면 스레드 자체가 가비지 수집되지 않으므로 마지막 응답이 ClientImpl.responseContext WeakHashMap에서 삭제되지 않습니다. 그리고 여러분의 반응이 클수록 메모리가 가득 차고 메모리 누수 문제가있는 것처럼 보입니다.

다음되는 솔루션 :

ClientProxy.getClient(webServicesPT).getResponseContext().clear(); 
: 다음 코드를 사용하여 풀 서비스 포트 인스턴스를 반환 할 때 수동 responseContext을 취소해야