2012-12-05 2 views
1

MINA 클라이언트에 대해 약간의 문제가 있습니다.Apache MINA는 사용하지 않은 데이터를 제거하지 않습니다.

서버에 대한 연결을 하나만 만들면 서버는 주기적으로 일종의 데이터를 보냅니다.

요약하면 클라이언트가 서버에 연결됩니다. 서버는 클라이언트에 문자열을 되돌려 보내고 모든 단계는 동일한 열린 연결 (동일한 클라이언트 객체 및 클라이언트 처리기)을 사용합니다.

하지만 문제는 이전 데이터가 GC로 수집되지 않는다는 것입니다. 사용 된 힙은 초 단위로 커지고 결코 줄어들지 않습니다. 내 messageReceived 메서드가 비어 있습니다!

public void messageReceived(IoSession session, Object message) { } 

아이디어가 있으십니까?

답변

0

절대 감소하지 않으면 -XX:+HeapDumpOnOutOfMemoryError을 사용하면 메모리 부족 오류가 발생하여 힙 덤프가 발생합니다.

사용 된 메모리 양은 중요하지 않으며, 전체 GC 후에 얼마나 많은 양이 유지되는지는 중요하지 않습니다. VisualVM을 실행하고 주기적으로 전체 GC를 triggger하고 ​​그 후에 얼마나 많은 자유가 있는지 살펴볼 것을 제안합니다.

+0

VisualVM을 사용하여 시스템을 모니터링하고 몇 분 동안 실행하도록했습니다. 예상대로, 메모리 값이 증가하면 응용 프로그램이 OutOfMemory 예외를 throw합니다. 서버는 문자열을 Client로 보냅니다. char [] 변수가 증가하는 이유입니다. 클라이언트와 서버 모두 서로를 듣는 스레드를 가지고 있습니다. 어쩌면 GC는 스레드에서 문자를 수집하지 않습니다 (이유는 모르겠다)? 이 상황에서 도움이 정말로 필요합니다. – ftb

+0

GC는 보존중인 항목을 정리하지 않습니다. char *]를 참조하는 것이 * 이것이 정리되지 못하게하는 것을 찾아야합니다. BTW 나는 당신이 그렇지 않으면 당신의 프로그램이 실제로'String'을 유지하고 있다고 의심합니다. ;) –

+1

그리고 나는 매번 새로운 연결을 의미하는 새로운 Client 객체를 만들면 mem이 증가하지 않는다는 것을 알았다. 스레드와 그 변수를 죽이면 사용 된 메모리가 해제된다는 뜻입니다. – ftb

1

VisualVM 자체로 인해 많은 쓰레기가 발생합니다. 빈 응용 프로그램을 시작하고 스레드를 잠자기하고 VisualVM을 활성화하고 수집 할 쓰레기 시작을 볼 수 있습니다. 코드 없음.

하지만, mina가 유지되지 않고 가비지 수집되지 않는 장기 실행 항목을 생성하는 유사한 문제가 있습니다 (Full GC를 실행하지 않는 한). 이 문제로 인해 실제 메모리가 4MB 인 응용 프로그램이 한 시간에 80MB로 표시 될 수 있습니다. 결코 수집되지 않습니다.

나는 이런 식으로 다시 시작하지 않고 오랜 기간 동안 서버를 온라인 상태로 유지할 수 없기 때문에 NIO를 감싸는 자체 프레임 워크를 만들려고합니다.

+0

소켓 세션을 사용법에 따라 새로 고치는 연결 풀을 사용하여이 문제를 해결했습니다. 예를 들어, 소켓과 해당 세션이 50 번 (50 트랜잭션) 동안 사용되면 해당 스레드는 강제 종료되고 새로 고쳐지고 다시 연결됩니다. 이 방법을 사용하여 사용 된 메모리를 해제 할 수 있습니다. 최고의 솔루션이 아니라 그 작업! :) – ftb

+0

나는 모든 것을 스스로 지었다. 단일 소켓은 각 방향으로 100MB/s를 처리 할 수 ​​있으며 서버는 3MB 이상의 메모리를 사용하지 않습니다. 그것은 매우 자주 수집되는 50MB의 GC를 생성합니다. – bond

관련 문제