저는 Java를 처음 접했고 Java의 가비지 수집기에 대해 혼란 스럽습니다. 실제로 무엇을하고 언제 작동합니까? Java에서 가비지 수집기의 일부 속성을 설명하십시오.
답변
가비지 컬렉터는 온 실행되는 프로그램입니다 자바 가상 머신 더 이상 자바 응용 프로그램에서 사용되지 않는 객체를 제거한다. 자동 메모리 관리 의 한 형태입니다 .
일반적인 Java 애플리케이션이 실행 중일 때 String
s 및 File
s 와 같은 새 객체를 생성 하지만 일정 시간이 지나면 해당 객체는 더 이상 사용되지 않습니다. 예를 들어, 다음 코드를 살펴보십시오.
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 모두 가비지 수집 대상이됩니다.
가비지 수집을위한 힙 생성-
자바 객체가 만들어집니다 Heap
및 Heap
자바의 가비지 컬렉션을 위해서 세 부분 또는 세대로 구분되며, 이들은라고 같은 영 (새로운) 세대, 종신 (구) 생성 및 페름 지역 힙.
New Generation 은 Eden 공간, Survivor 1 및 Survivor 2 공간으로 알려진 세 부분으로 더 나뉩니다. 객체가 힙에서 처음 생성 될 때 Eden 공간 내부의 새로운 세대에서 생성되고 객체가 살아남 으면 후속 마이너 가비지 컬렉션 이후에 생성 됩니다.
Java Heap의 Perm 공간 은 JVM이 클래스 및 메소드, 문자열 풀 및 클래스 레벨 세부 사항에 대한 메타 데이터를 저장하는 곳입니다.
자세한 내용은 여기를 참조하십시오 : 가비지 컬렉션
System.gc()
또는 Runtime.gc()
메소드를 사용하여 요청할 수 있지만 JVM이 가비지 수집을 실행하도록 강제 할 수는 없습니다 .
public static void gc() {
Runtime.getRuntime().gc();
}
public native void gc(); // note native method
Mark and Sweep 알고리즘-
이것은 가비지 수집에서 가장 많이 사용되는 알고리즘 중 하나입니다. 모든 가비지 수집 알고리즘은 두 가지 기본 작업을 수행해야합니다. 하나는 도달 할 수없는 모든 개체를 감지 할 수 있어야하고 두 번째는 가비지 개체가 사용하는 힙 공간을 회수하고 해당 공간을 프로그램에서 다시 사용할 수 있도록해야한다는 것입니다.
위의 작업은 Mark 및 Sweep 알고리즘에 의해 두 단계로 수행됩니다.
- 마크 단계
- 스윕 단계
자세한 내용은 여기를 참조하십시오 -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 를 확인하십시오.
