[java] Java의 가비지 수집기는 무엇입니까?

저는 Java를 처음 접했고 Java의 가비지 수집기에 대해 혼란 스럽습니다. 실제로 무엇을하고 언제 작동합니까? Java에서 가비지 수집기의 일부 속성을 설명하십시오.



답변

가비지 컬렉터는 온 실행되는 프로그램입니다 자바 가상 머신 더 이상 자바 응용 프로그램에서 사용되지 않는 객체를 제거한다. 자동 메모리 관리 의 한 형태입니다 .

일반적인 Java 애플리케이션이 실행 중일 때 Strings 및 Files 와 같은 새 객체를 생성 하지만 일정 시간이 지나면 해당 객체는 더 이상 사용되지 않습니다. 예를 들어, 다음 코드를 살펴보십시오.

for (File f : files) {
    String s = f.getName();
}

위의 코드에서는 루프가 String s반복 될 때마다 생성됩니다 for. 이것은 모든 반복에서 String객체 를 만들기 위해 약간의 메모리가 할당된다는 것을 의미 합니다.

코드로 돌아 가면 단일 반복이 실행되면 다음 반복 String에서 이전 반복에서 생성 된 객체가 더 이상 사용되지 않음을 알 수 있습니다. 이제 해당 객체는 “가비지”로 간주됩니다.

결국 우리는 많은 쓰레기를 얻기 시작할 것이고 더 이상 사용되지 않는 객체에 메모리가 사용될 것입니다. 이것이 계속되면 결국 자바 가상 머신은 새로운 객체를 만들기위한 공간이 부족해질 것입니다.

그것이 가비지 수집기가 개입하는 곳입니다.

가비지 수집기는 더 이상 사용되지 않는 개체를 찾아 제거하여 다른 새 개체가 해당 메모리를 사용할 수 있도록 메모리를 확보합니다.

자바에서 메모리 관리는 가비지 컬렉터에 의해 처리되어 있지만, C와 같은 다른 언어로, 하나의 요구는 다음과 같은 자신의 사용 기능에 메모리 관리를 수행 malloc하고free . 메모리 관리 는 실수하기 쉬운 것들 중 하나이며, 메모리 누수 ( 메모리가 더 이상 사용되지 않을 때 메모리가 회수되지 않는 곳)로 이어질 수 있습니다 .

가비지 수집과 같은 자동 메모리 관리 체계를 사용하면 프로그래머가 메모리 관리 문제에 대해 그다지 걱정할 필요가 없으므로 개발해야하는 응용 프로그램 개발에 더 집중할 수 있습니다.


답변

프로그램에서 더 이상 사용하지 않는 개체에 할당 된 메모리를 해제하므로 이름이 “가비지”입니다. 예를 들면 :

public static Object otherMethod(Object obj) {
    return new Object();
}

public static void main(String[] args) {
    Object myObj = new Object();
    myObj = otherMethod(myObj);
    // ... more code ...  
}

나는 이것이 극도로 인위적이라는 것을 알고 있지만, 여기에서 생성 otherMethod()된 원본 Object은 도달 할 수 없게됩니다. 이것이 가비지 수집을받는 “쓰레기”입니다.

Java에서 GC는 자동으로 실행되지만 다음을 사용하여 명시 적으로 호출 할 수도 있습니다. System.gc()시도 의 주요 가비지 수집을 강제로. Pascal Thivent가 지적했듯이, 당신은 정말로 이것을 할 필요 가 없으며 그것은 좋은 것보다 더 많은 해를 끼칠 수 있습니다 ( 이 질문 참조 ).

자세한 내용은 가비지 컬렉션 에 대한 wikipedia 항목을 참조하십시오.튜닝 가비지 컬렉션 (Oracle 제공)을 참조하십시오.


답변

객체는 라이브 스레드 또는 정적 참조에서 도달 할 수없는 경우 가비지 수집 또는 GC에 적합합니다.

즉, 모든 참조가 null 인 경우 개체가 가비지 수집 대상이된다고 말할 수 있습니다. 순환 종속성은 참조로 계산되지 않으므로 개체 A에 개체 B에 대한 참조가 있고 개체 B에 개체 A에 대한 참조가 있고 다른 라이브 참조가없는 경우 개체 A와 B 모두 가비지 수집 대상이됩니다.


가비지 수집을위한 힙 생성-

자바 객체가 만들어집니다 HeapHeap자바의 가비지 컬렉션을 위해서 세 부분 또는 세대로 구분되며, 이들은라고 같은 영 (새로운) 세대, 종신 (구) 생성 및 페름 지역 힙.

Java 힙 공간
New Generation 은 Eden 공간, Survivor 1 및 Survivor 2 공간으로 알려진 세 부분으로 더 나뉩니다. 객체가 힙에서 처음 생성 될 때 Eden 공간 내부의 새로운 세대에서 생성되고 객체가 살아남 으면 후속 마이너 가비지 컬렉션 이후에 생성 됩니다.

Java Heap의 Perm 공간 은 JVM이 클래스 및 메소드, 문자열 풀 및 클래스 레벨 세부 사항에 대한 메타 데이터를 저장하는 곳입니다.

가비지 수집을위한 힙 생성

자세한 내용은 여기를 참조하십시오 : 가비지 컬렉션


System.gc()또는 Runtime.gc()메소드를 사용하여 요청할 수 있지만 JVM이 가비지 수집을 실행하도록 강제 할 수는 없습니다 .

java.lang.System에서

public static void gc() {
    Runtime.getRuntime().gc();
}

java.lang.Runtime에서

public native void gc();  // note native  method

Mark and Sweep 알고리즘-

이것은 가비지 수집에서 가장 많이 사용되는 알고리즘 중 하나입니다. 모든 가비지 수집 알고리즘은 두 가지 기본 작업을 수행해야합니다. 하나는 도달 할 수없는 모든 개체를 감지 할 수 있어야하고 두 번째는 가비지 개체가 사용하는 힙 공간을 회수하고 해당 공간을 프로그램에서 다시 사용할 수 있도록해야한다는 것입니다.

위의 작업은 Mark 및 Sweep 알고리즘에 의해 두 단계로 수행됩니다.

  1. 마크 단계
  2. 스윕 단계

자세한 내용은 여기를 참조하십시오 -Mark and Sweep 알고리즘


답변

가비지 수집기는 프로그램에 더 이상 필요하지 않은 개체가 “가비지”이며 버릴 수 있음을 의미합니다.


답변

가비지 콜렉터는 참조되지 않는 객체가 메모리에서 해제되도록하는 JRE의 일부입니다.
일반적으로 앱의 메모리가 부족할 때 실행됩니다. AFAIK는 객체와 분리 된 객체 사이의 링크를 나타내는 그래프를 보유하고 있습니다.
성능을 절약하기 위해 세대로 그룹화 된 현재 객체는 GC가 객체를 스캔하고 여전히 참조되고 있음을 발견 할 때마다 1 씩 증가 된 세대 수 (최대 최대 값, 3 또는 4로 생각), 새로운 세대가 먼저 스캔됩니다. (메모리의 개체가 가장 짧을수록 더 이상 필요하지 않음) GC가 실행될 때마다 모든 개체가 스캔되는 것은 아닙니다. 자세한 내용은 이것을
읽으십시오 .


답변

가비지 수집기를 사용하면 컴퓨터가 무한 메모리가있는 컴퓨터를 시뮬레이션 할 수 있습니다. 나머지는 단지 메커니즘입니다.

코드에서 더 이상 메모리 청크에 액세스 할 수없는시기를 감지하고 해당 청크를 무료 저장소로 반환하여이를 수행합니다.

편집 : 예, 링크는 C # 용이지만 C #과 Java는 이와 관련하여 동일합니다.


답변

많은 사람들은 가비지 수집이 죽은 개체를 수집하고 폐기한다고 생각합니다.
실제로 Java 가비지 콜렉션은 그 반대입니다! 살아있는 물체는 추적되고 다른 모든 것은 쓰레기로 지정됩니다.

개체가 더 이상 사용되지 않으면 가비지 수집기는 기본 메모리를 회수하고 향후 개체 할당을 위해 다시 사용합니다. 즉, 명시적인 삭제가 없으며 운영 체제에 메모리가 다시 제공되지 않습니다. 더 이상 사용되지 않는 개체를 확인하기 위해 JVM은 마크 앤 스윕 알고리즘이라고하는 것을 간헐적으로 실행합니다.

자세한 내용은 http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx 를 확인하십시오.