가비지 수집기(메모리 회수기)의 동작 라인
가비지 수집기가 메모리를 자동으로 관리하므로 Java 프로그래머는 메모리 할당을 모니터링할 필요가 없습니다. 가비지 콜렉터는 JVM(Java Virtual Machine)에 의해 실행됩니다. 가비지 수집기는 주기적으로 실행되어 더 이상 필요하지 않은 개체에 사용되는 메모리를 해제하는 우선 순위가 낮은 프로세스입니다. JVM마다 가비지 수집 알고리즘이 다릅니다. 예를 들어 참조 계산 알고리즘 또는 마크업 및 스크래핑 알고리즘과 같은 여러 가지 알고리즘이 사용됩니다.
Java에서 가비지 수집기 실행
JVM은 일반적으로 사용 가능한 메모리가 부족할 때 가비지 수집기를 실행합니다. 그러나 가비지 수집기의 작동이 항상 충분한 여유 메모리가 있음을 보장하지는 않습니다. 복구 후에도 메모리가 부족하면 JVM에서 OutOfMemoryError 예외가 발생합니다. JVM은 예외를 발생시키기 전에 최소한 한 번은 가비지 수집기를 실행해야 합니다. 가비지 수집기가 Java에서 실행되도록 요청할 수 있지만 이 작업을 강제로 수행할 수는 없습니다.
가비지 수집기 실행 요청
요청하려면 다음 메서드 중 하나를 호출하면 됩니다.
System.gc()
Runtime.getRuntime().gc()
가비지 수집기 실행에 대한 적합성
살아있는 스트림에서 더 이상 사용할 수 없는 개체는 폐기되어야 합니다. 객체는 다양한 경우에 폐기될 수 있습니다.
- 객체를 참조하는 참조 유형의 변수가 "0"으로 설정된 경우 해당 객체에 대한 다른 참조가 없으면 해당 객체를 폐기해야 합니다.
- 객체를 참조하는 참조형의 변수가 다른 객체를 참조하기 위해 생성된 경우, 해당 객체에 대한 다른 참조가 없으면 해당 객체를 폐기해야 합니다.
- 메서드에서 로컬로 생성된 개체는 해당 메서드에서 내보내지지 않는 한(즉, 예외로 반환되거나 발생되는) 메서드가 종료될 때 삭제됩니다.
- 서로를 참조하는 개체는 라이브 스레드에서 사용할 수 없는 경우 폐기될 수 있습니다.
예를 살펴보겠습니다:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
이 예에서
Integer
o1이 원래 참조한 객체(정수)는 이제 o1이 객체
String
(문자열)를 참조하기 때문에 라인 3 이후에 삭제될 수 있습니다. o2가 null을 참조하도록 생성되었더라도 해당 객체
String
(문자열)는 o1이 참조하므로 재활용이 불가능합니다.
마무리
finalize()
Java 기술을 사용하면 가비지 수집기가 메모리에서 개체를 검색하기 전에 필요한 정리 작업을 수행하는 메서드(최종화)를 사용할 수 있습니다 . 가비지 수집기가 개체에 대한 참조가 더 이상 없다고 판단하면 가비지 수집기가 개체에 대해 이 메서드를 호출합니다. 이는 클래스에 설명되어 있습니다
Object
. 이는 모든 클래스에서 상속된다는 의미입니다.
finalize()
서브클래스는 시스템 리소스에서 자신을 해제하거나 다른 정리를 위해 메서드를 재정의합니다 .
protected void finalize() throws Throwable
메소드에 의해 등록되지 않은 예외가 발생하면
finalize()
예외가 무시되고 해당 객체의 종료가 중지됩니다. 이 메소드는
finalize()
객체의 수명 동안 한 번만 호출됩니다.
finalize()
모든 객체에 대해 메소드를 사용하여 폐기로부터 보호하는 것이 가능합니다 . 그러나 이 경우에는 이 개체에 대해 가비지 수집기가 더 이상 활성화되지 않습니다
finalize()
. 이 메소드는
finalize()
객체가 가비지 수집되기 전에 항상 한 번 호출됩니다.
finalize()
그러나 해당 객체는 폐기 대상이 아니기 때문에 해당 객체가 존재하는 전체 기간 동안 해당 객체에 대해 메서드가 활성화되지 않을 수도 있습니다 .
요약
이번 절에서는 자바 언어의 메모리 관리 기술인 가비지 컬렉션(garbage collection) 과정을 살펴보았습니다. 가비지 수집을 강제로 수행할 수 없습니다. 우리는 객체를 재활용할 수 있게 만드는 다양한 방법에 대해 배웠고
finalize()
가비지 수집기가 객체를 회수하기 전에 해당 메서드가 호출된다는 것을 배웠습니다.
운동
질문: 7행 이후에는 몇 개의 객체가 폐기 대상이 됩니까?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
답 옵션: A. 0 B. 1 C. 2 D. 3 E. 코드를 컴파일할 수 없습니다.
올바른 옵션: B
설명: 라인 1, 2, 3에서 생성된 세 개체 중 해당 개체만
Integer
다음 위치에서 삭제되어야 합니다. 7행 끝. 원래 object 를 참조했던 변수 참조 a는 5행의
Integer
객체를 참조합니다 . 따라서 5행 이후에는 객체를 참조하는 변수가 없으므로 해당 객체를 삭제해야 합니다. 변수 및 6행과 7행의 객체 와 객체를 참조하므로 재활용할 수 없습니다.
String
Integer
b
c
String
Long
GO TO FULL VERSION