2010-11-25 3 views
2

java에서 RandomAccessFile을 사용하고 있습니다. 메모리 누수 문제가 있습니다. 나는 다음에 내 코드를 단순화 :RandomAccessFile 메모리 누수

public static void main(String[] args) throws IOException, InterruptedException 
{ 
    RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw"); 
    r.write(new byte[150000000], 0, 150000000); 
    r.getFD().sync(); 
    r.close(); 
    r = null; 

    while (true) { Thread.sleep(1000); } 
} 

응용 프로그램에 대한보고 메모리 사용이 코드를 실행 (및 GC를위한 충분한 시간을 허용) 후 1백50메가바이트 조금 넘는이다.

내가 무엇을 놓쳤는가? 아니면 자바가 책임이 있습니까?

답변

1

메모리는 GC 실행 중에 만 회수되며 GC는 필요할 때만 실행됩니다. 메모리 사용량이 떨어지는 것을 보려면 System.gc()를 호출하십시오.

BTW : 자바는 OS를 메모리로 반환하지 않아도되지만 내부 메모리가 증가하는 경향이 있습니다.

+2

자바 *하지 * 오라클 JVM은 매우 reluctanty이기는하지만,하지 적어도 OS에 반환 메모리. –

+0

@Michael, 고마워. –

2

어떻게 메모리 사용량을 확인합니까? OS에서보고하는 사용법은 Java 힙 크기가 확장되었음을 나타냅니다. 힙이 비어 있는지 또는 힙이 가득 찼는지 GC에 적합한 오브젝트로 알 수 없습니다.

Java 관련 도구 (예 : VisualVM 또는 jmap)를 사용해야합니다. 이렇게하면 힙 메모리 상태를보다 잘 알 수 있습니다. VisualVM을 사용하면 수동으로 GC를 활성화 한 다음 힙 점유를 점검하여 메모리 누수가 있는지 여부를 확인할 수 있습니다.

6

GC는 메모리를 JVM 내에서만 사용할 수 있도록합니다. GC로 해제 된 메모리는 이 아니며은 자동으로 OS로 반환됩니다. JVM은 일반적으로 메모리를 OS로 반환하는 것을 매우 꺼려합니다. 곧 다시 필요할 것이므로 OS에서 메모리를 가져 오는 것은 상대적으로 비싼 작업입니다.

사용 중이거나 사용 가능한 힙 메모리의 백분율을 보려면 Visual VM을 사용할 수 있습니다. 당신은 JVM 간절히 OS의 MOR에 메모리를 반환 할 경우, tuning parameters of the Oracle JVM, 특히 -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio을 사용할 수 있습니다