2011-02-05 5 views
1

저는 웹 사이트에서 만든 게임에서 최고 기록을 호스팅하는 Java 기반 명령 줄 서버를 운영하고 있습니다. 그것은 효율적이고 빠르게 작동합니다. 그러나, 그것은 약 200MB의 RAM을 차지합니다! 내가 수동으로 모든 것을 제로 화시키는에서 나는 이것이 내가 소켓 연결에서 사용하는 입력 스트림과 출력 스트림 객체를 함께 할 수있는 뭔가가있을 것을 의심하기 시작하고있다() Java Game Server가 너무 많은 메모리를 차지합니다!

으로 System.gc를 호출에 모든 노력을했다. 프로그램을 처음 실행하면 정상적인 RAM 용량을 차지하는 것으로 나타났습니다. 그런 다음 연결이되면 100MB로 점프하고 각 연결마다 계속 높게 유지됩니다.

편집 : 내 수업 중 하나에서 나는 3 개의 다른 ArrayLists에서 모든 이름, 점수 및 타임 스탬프를 보유합니다. 그러나 jhat와 jmap을 사용한 철저한 검사 결과 약 5MB의 RAM 만 사용한다는 것을 보여주었습니다.

누군가가 대답하기가 너무 모호한 경우 물어보십시오. 기꺼이 소스 코드를 제공 할 것입니다.

+2

각 연결마다 상승하고 클라이언트 연결이 끊어지면 떨어지지 않는 경우 닫힌 소켓에 대한 참조가 유지되고있을 가능성이 높습니다. – ide

+0

JVM이 .NET과 같은 경우 가비지 수집을 "강제 실행"하는 것은 사용되지 않은 객체가 참조가없는 경우에도 실제로 아무것도 수집하지 않을 수 있습니다. 또한 300M에 24GB RAM을 구입할 수 있다면 200M은 땅콩입니다. 이게 정말 문제 야? –

+0

@ide 각 연결마다 많이 올라간다. 그런 다음 연결이 끊어짐에 따라 조금 떨어진다. 수명이 끝나기 전에 모든 개체에 대한 각 참조를 수동으로 null로 만들려고했기 때문이다. – ra4king

답변

3

수명이 다한 물체에 대한 참조를 유지하면 누출이 발생할 수 있습니다.

프로파일 러를 사용하여 조사하는 것이 좋습니다. 좋은 시작은 Java 6와 함께 배포되는 VisualVM 프로그램입니다.

프로파일 러는 JVM에 연결하거나 프로그램의 JVM을 호스트하고 프로그램 실행을 모니터링하는 별도의 프로그램입니다. 통계적으로 또는 실행 코드를 "계측"하여 객체 할당 및 코드 실행을 추적 할 수 있습니다. 객체가 할당되고 해제되지 않은 경우 표시되며 객체가 어디에 있는지, 객체가 할당 된 위치 (많은 유용한 것들 중에서)를 표시 할 수 있습니다.

필자는 상용 인 jProfiler를 사용합니다 (그러나 전문가에게는 그만한 가치가 있습니다). 지난 번 내가 무료로 사용할 수있는 몇 가지 좋은 품질의 프로파일 러가 있었다 (적어도 개인적인 용도로). VisualVM은 기본적이지만 유용한 프로파일 링 기능을 가지고 있습니다. (Windows에서는 JDK bin 디렉토리에서 찾을 수 있으며, Linux 및 Mac에서도 마찬가지입니다).

+1

프로필러 제안 +1 +1 –

+0

프로필러 란 무엇입니까? – ra4king

+0

오 예 예전에 프로파일 러를 사용했는데, 그렇게 부르다는 사실을 몰랐습니다 : P 그러나 VisualVM을 한번도 사용 해본 적이 없어서 잠시 조사 할 것입니다. 고맙습니다! – ra4king

0

jmap 다음에 jhat를 사용하여 메모리가 실제로 어떻게 사용되고 있는지 확인하십시오.

Sun의 (Oracle의) JVM은 결코 메모리를 OS로 다시 릴리스하지 않으므로 메모리 사용이 단조롭게 증가하는 것은 놀라운 일이 아닙니다.

+0

jmap 히스토그램 옵션은 총 25MB의 메모리와 거의 50 만 개의 인스턴스가 있다고 말하는 정상적인 결과를 산출했습니다. jhat 덤프 다음에 jhat도 정상적인 결과를 보였다. – ra4king

+0

@ 로이, 나는 그것이 50 만 개가 존재할 것으로 기대하는지에 따라 당신이 정말로 문제가 없다는 증거라고 말할 수 있습니다. (그렇습니까? 그렇지 않다면, jhat에서 리퍼러 그래프를 진행하십시오.) 그런데 어떻게 메모리 사용을 판단합니까? Java에 할당 된 가상 메모리의 크기를보고 있습니까? 아니면 상주 세트의 크기를보고 있습니까? – rlibby

+0

작업 관리자의 개인 작업 세트를 보았습니다 – ra4king

관련 문제