객체는 새로 사용하여 생성되지만 객체가 차지하는 메모리를 재활용하기위한 해당 삭제 작업은 없습니다. 우리가 객체의 사용을 완료 할 때, 우리는 단순히 그 객체를 언급하는 것을 중단합니다. 다른 물체를 가리키거나 null을 가리키기 위해 참조를 변경하십시오. 또는 메소드의 로컬 변수가 더 이상 존재하지 않도록 메소드에서 돌아와서 이러한 로컬 변수에 대한 참조가 객체를 가리키지 않도록하십시오. 더 이상 참조되지 않은 물체를 쓰레기라고합니다. 이 물체를 찾고 재활용하는 과정을 쓰레기 수집이라고합니다.
Java Virtual Machines는 쓰레기 수집을 사용하여 참조 된 객체가 메모리에 유지되도록하고 실행 코드의 참조를 통해 도달 할 수없는 객체가 차지하는 저장 공간을 확보합니다. 이는 루트 참조에서 시작하는 참조 체인 (즉, 실행 코드에서 직접 액세스 할 수있는 참조) 인 경우 객체가 재활용되지 않는 경우 강력한 보장입니다.
요컨대, 실행 가능한 코드에서 객체에 도달 할 수 없으면 공간을 재활용 할 수 있습니다. 메모리 공간이 재활용되는지 여부는 쓰레기 수집기에 의해 결정되기 때문에 "CAN"이라는 단어를 사용합니다. 일반적으로 쓰레기 수집기는 더 많은 메모리 공간이 필요한 경우에만 실행되거나 메모리 오버플로를 피하기 위해 실행됩니다. 그러나이 프로그램은 메모리 오버플로 또는 메모리 오버플로에 가깝지 않은 경우에도 종료 될 수 있으므로 쓰레기 수집이 전혀 필요하지 않을 수 있습니다. 현재 실행 된 모든 방법에서 모든 변수에 객체에 대한 참조가 포함되어 있고 이러한 변수에서 시작 하여이 객체에 대한 참조를 참조 체인을 따라 모든 도메인이나 배열 요소에서 찾을 수는 없으며 객체는 "도달 할 수 없음"이라고합니다.
쓰레기 재활용은 우리가 언급하는 것에 대해 걱정할 필요가 없다는 것을 의미합니다. 객체를 삭제할 때 프로그래머가 직접 제어 할 수있는 시스템에서 프로그래머는 다른 객체가 여전히 참조하는 객체를 삭제할 수 있습니다. 프로그래머가 이러한 객체를 삭제하면 여전히 삭제 된 객체를 참조하는 참조는 침묵을 참조하기 때문에 무효가됩니다.
이 시스템은이를 할당 가능한 메모리 공간으로 간주하지만 실제로 공간은 해제되었습니다. 이 시스템은이 할당 가능한 공간을 새 객체에 할당 할 수 있으므로 원래 공간을 가리키면 실제로 예상되는 것과 완전히 다른 객체가 발생합니다. 이 경우, 프로그램 이이 공간에 저장된 값을 사용하여 소속되지 않은 객체로 작동 할 때 예측할 수없는 재난이 발생할 수 있습니다. 쓰레기 수집은 여전히 참조 된 모든 물체가 쓰레기 수집으로 취급되지 않기 때문에 우리를 위해 참조하는 문제를 해결합니다. 쓰레기 수집은 또한 실수로 동일한 물체를 여러 번 삭제하는 문제를 해결합니다.이 문제는 재난을 유발할 수도 있습니다. 쓰레기 물체의 재활용은 우리의 개입이 필요하지 않지만, 재활용 쓰레기는 일정량의 시스템 자원을 차지할 것입니다. 많은 수의 물체의 생성 및 재활용은 시간이 크리티컬 응용 프로그램을 방해 할 수 있으므로 이러한 시스템을 설계 할 때는 재활용 할 가비지의 양을 줄이기 위해 생성 된 물체의 수를 신중하게 처리해야합니다.
쓰레기 수집은 메모리가 항상 새로운 객체를 만들 수있는 공간이 있음을 보장하지는 않습니다. 예를 들어, 객체를 계속 생성하고 목록에 넣으면 새 개체를 만들 수있는 공간이 충분하지 않고 참조되지 않은 객체가 없을 때 더 이상 새 객체를 만들 수 없습니다. 위의 목록을 더 이상 필요하지 않은 개체에 대한 참조를 유지하면 메모리 누출이 발생합니다. 쓰레기 수집은 많은 (전부는 아님) 메모리 할당 문제를 해결합니다.
쓰레기 수집가와 상호 작용하십시오
Java 언어 자체는 유휴 물체를 처분하는 명백한 방법이 없지만 쓰레기 수집기를 직접 호출하여 더 이상 사용하지 않는 객체를 찾을 수 있습니다. 런타임 클래스 및 시스템 클래스의 몇 가지 편리한 방법을 사용하면 쓰레기 수집기를 호출하거나 실행할 모든 최종화기를 실행하거나 현재 메모리 상태를 볼 수 있습니다.
.public void gc Q :이 방법은 Java 가상 머신에 더 이상 사용되지 않는 에너지 재활용 객체를 사용하여 이러한 객체가 차지하는 메모리를 재사용 할 수 있도록 요청합니다.
.public void runfinalization () :이 메소드는 Java 가상 머신에 다음의 최종화기를 실행하는 에너지를 소비하도록 요청합니다. 도달 할 수 없지만 최종화기가 아직 실행되지 않은 객체.
"Public Long Freedom () : 시스템 메모리에서 사용 가능한 바이트 수를 반환합니다.
public public long total memory () : 시스템 메모리에서 총 바이트 수를 반환합니다.
.public long maxmemoryo : Java 가상 머신에서 사용할 수있는 최대 시스템 메모리의 바이트 수를 반환합니다. 운영 체제에 Java 가상 머신에 대한 메모리 사용 제한이없는 경우. 최대 값이 반환됩니다. Java에는 시스템의 최대 메모리를 설정하는 방법이 없습니다. 일반적으로 Java Virtual Machines는 명령 줄 또는 기타 구성 옵션을 통해이 값을 설정합니다.
위의 방법을 호출하려면 정적 메소드 런타임을 통해 현재 런타임 객체에 대한 참조를 얻어야합니다. 시스템 클래스는 정적 GC 및 Runfinalization 메소드를 지원하며 현재 Runt-Ime 객체에서 해당 메소드를 호출합니다. 다시 말해, System.gc ()는 runtime.getRuntime (). gc () 메소드와 같습니다.
runtime.gc () 메소드를 호출 할 때 쓰레기 수집기는 재활용 할 가비지가 없을 수 있으며 모든 쓰레기 수집가가 요청시 재활용 가능한 물체를 발견 할 수 없기 때문에 추가 메모리를 확보하지 못할 수 있습니다. 따라서 쓰레기 수집기를 호출하는 데 아무런 영향을 미치지 않을 수 있습니다. 그러나 Runtime.gc () 메소드를 호출하는 데 많은 수의 객체, 특히 쓰레기 수집 오버 헤드가 영향을 줄 수있는 시간 크리티컬 애플리케이션에서 원하는 것이 바람직합니다. 실행에는 두 가지 잠재적 이점이 있습니다. 첫 번째는 응용 프로그램을 실행하기 전에 가능한 한 많은 메모리를 얻을 수 있다는 것입니다. 두 번째는 작업 실행 중에 쓰레기 수집기가 실행될 가능성을 줄일 수 있다는 것입니다. 다음 방법은 런타임에 릴리스 할 수있는 모든 공간을 적극적으로 출시합니다.
public static vo recordful1gc () {runtime rt = runtime.getRuntime (); long isfree = rt.freememory (); 오랫동안은 그렇지 않았다. do {wasfree = isfree; rt.runfinalization (); rt.gc (); isfree two rt.freememory (); } while (isfree> wasfree); }이 방법은 끊임없이 반복되고 있으며 Freememory의 값은 계속해서 Runfinalization 및 GC 방법을 호출함으로써 계속 증가합니다. 자유 메모리의 양이 더 이상 증가하지 않으면 방법의 루프가 종료됩니다.
우리는 일반적으로 가비지 수집기에 의해 최종 방법을 비동기로 호출하기 때문에 일반적으로 Runfinalization 메소드를 호출 할 필요가 없습니다. 예를 들어, 마무리 방법으로 재활용 할 수있는 리소스가 소진 될 때 경우에 따라 런 파일 화를 호출하여 가능한 한 많은 종단을 시행하는 것이 유용합니다. 그러나 종료되기를 기다리는 객체 가이 리소스를 사용하고 있다고 보장 할 수 없으므로 런 페일 화에는 영향을 미치지 않을 수 있습니다.
FullGC 방법은 대부분의 응용 분야에서 너무 급진적으로 보입니다. 가비지 수집이 필요한 특별한 경우, 모든 가비지가 System.GC 방법에 대한 단일 호출로 수집되는 것은 아니지만 대부분의 대부분입니다. 따라서 반복적 인 통화는 쓰레기 수집의 출력 속도를 줄이고 많은 시스템에서 이러한 반복 통화는 출력이 없습니다.