source

정적 필드가 가비지 수집용으로 열려 있습니까?

gigabyte 2023. 1. 2. 22:39
반응형

정적 필드가 가비지 수집용으로 열려 있습니까?

프로그램 셋업에서만 사용되는 가상 유틸리티 클래스는 다음과 같습니다.

class MyUtils {
   private static MyObject myObject = new MyObject();
   /*package*/static boolean doStuff(Params... params) {
       // do stuff with myObject and params...
   }
}

myObject는 더 이상 사용되지 않을 때 수집되는 가비지입니까, 아니면 프로그램 수명 동안 계속 유지됩니까?

클래스가 로드되는 동안에는 가비지 수집에 대해 정적 변수를 선택할 수 없습니다.각 클래스 로더(이 클래스의 로드를 담당)가 가비지용으로 수집되었을 때 이러한 로더를 수집할 수 있습니다.

JLS 섹션 12.7 클래스인터페이스의 언로드 확인

클래스 또는 인터페이스는 정의된 클래스 로더가 가비지 컬렉터에 의해 회수될 수 있는 경우에만 언로드할 수 있습니다.[...] 부트스트랩로더에 의해 로드된 클래스 및 인터페이스는 언로드할 수 없습니다.

정적 변수는 ClassLoaders에 의해 참조되는 클래스 객체에 의해 참조됩니다.따라서 ClassLoader가 어떤 방법으로든 클래스를 폐기하거나 ClassLoader 자체가 수집 대상이 되지 않는 한(WebApp을 언로드하는 것을 생각할 수 있습니다), 정적 변수(또는 참조하는 객체)는 수집되지 않습니다..

myObject는 참조이며 개체가 아닙니다.개체는 연결할 수 없기 때문에 참조가 없으면 자동으로 가비지가 수집됩니다.

따라서 정적 참조 "myObject" 뒤에 있는 개체는 참조를 취소할 경우 가비지 수집될 수 있습니다.

myObject = null;

이 오브젝트에 대한 다른 참조는 없습니다.

그러나 정적 참조 및 변수는 프로그램 수명 동안 유지됩니다.

정적 초기화에 임시 개체를 사용한 후 폐기하려는 경우 정적 이니셜라이저 블록을 사용할 수 있습니다.

class MyUtils {
   static
   {
      MyObject myObject = new MyObject();
      doStuff(myObject, params);
   }

   static boolean doStuff(MyObject myObject, Params... params) {
       // do stuff with myObject and params...
   }
}

static initializer block은 특별한 종류의 static 메서드이므로 myObject는 로컬 변수이며 블록 실행이 완료된 후 가비지가 수집될 수 있습니다.

이것이 당신의 질문에 대한 답변이라고 생각합니다.기본적으로 특수 클래스 로더에서 클래스가 오거나 클래스가 다운되지 않는 한.

여기서 중요한 것은 클래스 인스턴스의 가비지 컬렉션입니다.물건들.ClassLoader 인스턴스는 본질적으로 객체입니다.따라서 Classloader 객체가 가비지 수집되지 않은 경우 힙에 저장된 참조(즉, 정적)는 가비지 수집되지 않습니다.예외는 String pool입니다.

private static MyGiantClass myGiantObject = new MyGiantClass()이치노

언급URL : https://stackoverflow.com/questions/453023/are-static-fields-open-for-garbage-collection

반응형