저는 웹 사이트에서 만든 게임에서 최고 기록을 호스팅하는 Java 기반 명령 줄 서버를 운영하고 있습니다. 그것은 효율적이고 빠르게 작동합니다. 그러나, 그것은 약 200MB의 RAM을 차지합니다! 내가 수동으로 모든 것을 제로 화시키는에서 나는 이것이 내가 소켓 연결에서 사용하는 입력 스트림과 출력 스트림 객체를 함께 할 수있는 뭔가가있을 것을 의심하기 시작하고있다() Java Game Server가 너무 많은 메모리를 차지합니다!
으로 System.gc를 호출에 모든 노력을했다. 프로그램을 처음 실행하면 정상적인 RAM 용량을 차지하는 것으로 나타났습니다. 그런 다음 연결이되면 100MB로 점프하고 각 연결마다 계속 높게 유지됩니다.
편집 : 내 수업 중 하나에서 나는 3 개의 다른 ArrayLists에서 모든 이름, 점수 및 타임 스탬프를 보유합니다. 그러나 jhat와 jmap을 사용한 철저한 검사 결과 약 5MB의 RAM 만 사용한다는 것을 보여주었습니다.
누군가가 대답하기가 너무 모호한 경우 물어보십시오. 기꺼이 소스 코드를 제공 할 것입니다.
각 연결마다 상승하고 클라이언트 연결이 끊어지면 떨어지지 않는 경우 닫힌 소켓에 대한 참조가 유지되고있을 가능성이 높습니다. – ide
JVM이 .NET과 같은 경우 가비지 수집을 "강제 실행"하는 것은 사용되지 않은 객체가 참조가없는 경우에도 실제로 아무것도 수집하지 않을 수 있습니다. 또한 300M에 24GB RAM을 구입할 수 있다면 200M은 땅콩입니다. 이게 정말 문제 야? –
@ide 각 연결마다 많이 올라간다. 그런 다음 연결이 끊어짐에 따라 조금 떨어진다. 수명이 끝나기 전에 모든 개체에 대한 각 참조를 수동으로 null로 만들려고했기 때문이다. – ra4king