JavaRush /Java Blog /Random-KO /Java의 가비지 수집기
Diana
레벨 41

Java의 가비지 수집기

Random-KO 그룹에 게시되었습니다

가비지 수집기(메모리 회수기)의 동작 라인

가비지 수집기가 메모리를 자동으로 관리하므로 Java 프로그래머는 메모리 할당을 모니터링할 필요가 없습니다. 가비지 콜렉터는 JVM(Java Virtual Machine)에 의해 실행됩니다. 가비지 수집기는 주기적으로 실행되어 더 이상 필요하지 않은 개체에 사용되는 메모리를 해제하는 우선 순위가 낮은 프로세스입니다. JVM마다 가비지 수집 알고리즘이 다릅니다. 예를 들어 참조 계산 알고리즘 또는 마크업 및 스크래핑 알고리즘과 같은 여러 가지 알고리즘이 사용됩니다.쓰레기 수거 - 1

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);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
이 예에서 Integero1이 원래 참조한 객체(정수)는 이제 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);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
답 옵션: A. 0 B. 1 C. 2 D. 3 E. 코드를 컴파일할 수 없습니다. 올바른 옵션: B 설명: 라인 1, 2, 3에서 생성된 세 개체 중 해당 개체만 Integer다음 위치에서 삭제되어야 합니다. 7행 끝. 원래 object 를 참조했던 변수 참조 a는 5행의 Integer객체를 참조합니다 . 따라서 5행 이후에는 객체를 참조하는 변수가 없으므로 해당 객체를 삭제해야 합니다. 변수 및 6행과 7행의 객체 와 객체를 참조하므로 재활용할 수 없습니다. StringIntegerbcStringLong
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION