매우 많은 양의 트래픽을 처리하는 Java 서버에서 작업하고 있습니다. 서버는 클라이언트 (종종 메가 바이트)의 패킷을 받아들이고 다른 클라이언트로 전달합니다. 서버는 들어오는 패킷이나 나가는 패킷을 명시 적으로 저장하지 않습니다. 그러나 서버는 계속 OutOfMemoryException
예외로 실행됩니다.강제로 Java 오브젝트 강제 삭제
서버의 메시지 전달 구성 요소에 System.gc()
을 추가하여 메모리가 해제되기를 바랬습니다. 또한 JVM의 힙 크기를 기가 바이트로 설정했습니다. 나는 아직도 많은 예외를 받고있다.
내 질문은 다음과 같습니다. 메가 바이트 메시지가 무기한으로 대기열에 저장되지 않도록하려면 어떻게해야합니까? 이러한 객체에서 "힙"공간을 사용하지 않도록 "삭제"를 호출 할 수있는 방법이 있습니까?
try
{
while (true)
{
int r = generator.nextInt(100);//generate a random number between 0 and 100
Object o =readFromServer.readObject();
sum++;
// if the random number is larger than the drop rate, send the object to client, else
//it will be dropped
if (r > dropRate)
{
writeToClient.writeObject(o);
writeToClient.flush();
numOfSend++;
System.out.printf("No. %d send\n",sum);
}//if
}//while
}//try
여기에 대한 대답 중 일부는 내 참조가 저장하지 않습니다. 서버는 Objects를 전달하는 Socks 프록시입니다. 들어오는 스트림에서 객체를 읽고 나가는 스트림에 쓰는 while 루프가 있습니다. 그게 전부 야. 메모리 프로파일 러를 지금보십시오. –
"Effective Java"의 챕터를 매우 빨리 읽었습니다.) – Bozho
해당 스트림을 닫으시겠습니까? 일부 코드 제공 – Bozho