2010-08-17 5 views

답변

9

Java에서 메모리를 해제하지 마십시오. JVM에 의해 garbage collected입니다.

객체는 런타임에 힙에 할당되는 새로운 객체에 대한 자바의 "새로운" 연산자 및 메모리에 의해 만들어집니다. 가비지 수집은 이 더 이상 프로그램에서 참조하지 않는 개체를 자동으로 해제하는 프로세스입니다.

4

Java는 garbage collected입니다. 즉, 명시 적으로 메모리를 해제하지 않습니다. 대신, JVM은 더 이상 참조되지 않을 때 메모리를 자동으로 해제합니다. 참조하는 변수를 null으로 설정하여 명시 적으로 참조 해제했으나이를 반드시 가비지 수집한다고 보장 할 수는 없습니다.

+1

나는 이것에 대해 처음 알게 된 사람들이 어떻게 반응하는지 궁금해합니다. ("잠깐, 할 수있어, 자동으로 할 수 있니?") * HEAD EXPLODES *') – polygenelubricants

+1

제 반응은 "차가워졌습니다!"이제는 유용한 것들을 구현하는데 집중할 수 있습니다. " (처음으로 가비지 수집에 대한 직접적인 경험은 1980 년대 CLU에서였습니다.) –

+0

아마 "실제로 메모리를 해제하려면 어떻게해야합니까?" 그리고 나서 그들이 통제 할 수 없다는 것을 알게되면 머리가 폭발합니다. 그리고 System.gc()를 발견하고 가비지 수집에 대한 제안 일 뿐이라는 것을 알았을 때 또 다른 폭발이있었습니다. – Matt

0

아마도 System.gc()을 원하십니까?

+0

'System.gc()'는 일반적으로 나쁜 생각입니다. 그것은'Runtime.getRuntime(). gc()'과 동일하며, 내가 보았던 "쓰레기 수거"가비지 수집을 실행합니다. 쓰레기 수거는 쓰레 디드 프로그램에서 파괴적 일 수 있습니다.). – JBirch

+2

정말 잘못된 IDEA가 아닌'System.gc()'는'free' 또는'delete'와 유사하지 않습니다. 가장 좋은 대답은 "아날로그가 없다"입니다 ... –

+2

아주 제한된 수의 시나리오에서 'System.gc()'를 호출하는 것이 유용 할 수 있지만 요청 일 뿐이라는 것을 기억하는 것이 중요합니다. VM에 의해 무시된다. – Yuval

1

JVM에서 가비지 수집됩니다. 따라서 우리는 메모리를 명시 적으로 해제 할 필요가 없습니다.

1

자바에서는 개체가 garbagecollected 일 때 JVM 메모리가 자동으로 회수됩니다. Java의 오브젝트가 더 이상 참조되지 않거나 강하게 참조되지 않으면 (약하게 참조되는 경우) 가비지 콜렉션의 대상이됩니다. 그렇다고해서 Java 프로그램에서 메모리 누수가 발생하지는 않습니다. 주의를 기울이지 않으면 고전적인 예 에서처럼 메모리 누수가 발생할 수 있습니다.

public class Stack { 
    private Object[] elements; 
    private int size = 0; 

    public Stack(int initialCapacity) { 
     this.elements = new Object[initialCapacity]; 
    } 

    public void push(Object e) { 
     ensureCapacity(); 
     elements[size++] = e; 
    } 

    /** 
    * This method leaks memory 
    */ 
    public Object leakyPop() { 
     if (size == 0) 
     throw new EmptyStackException(); 
     // here is the leak, This object will never be GC'd because its still 
     // referenced in the elements array 
     return elements[--size];        
    } 

    /** 
    * This has a fix to avoid memory leak 
    */ 
    public Object pop() { 
     if (size == 0) 
     throw new EmptyStackException(); 
     Object result = elements[--size]; 
     // To avoid the leak you need to eliminate the reference here explicitely 
     elements[size] = null; 
     return result; 
    } 

    /** 
    * Ensure space for at least one more element, 
    */ 
    private void ensureCapacity() { 
     //... 
    } 
}