정적 필드에 대한 가비지 수집 이해
Java에서 정적 필드는 클래스 내에서 선언되지만 특정 필드에 바인딩되지 않는 필드입니다. 사례. 인스턴스 전체에서 공유 데이터를 유지 관리하고 프로그램 구성을 촉진하는 등 다양한 시나리오에서 중요한 역할을 합니다. 그러나 일반적인 질문이 생깁니다. 정적 필드는 언제 가비지 수집됩니까?
이 문제를 해결하기 위해 가상 유틸리티 클래스 MyUtils의 예를 고려해 보겠습니다.
class MyUtils { private static MyObject myObject = new MyObject(); /*package*/static boolean doStuff(Params... params) { // do stuff with myObject and params... } }
질문은 다음과 같습니다. 정적 필드 myObject는 더 이상 사용되지 않으면 가비지 수집 대상이 됩니까?
가비지 규칙 수집
이 질문에 답하려면 가비지 수집 규칙을 이해하는 것이 중요합니다. Java 힙의 다른 객체와 마찬가지로 정적 변수에는 다음과 같은 일반 가비지 수집 규칙이 적용됩니다. 객체는 라이브 참조에서 더 이상 접근할 수 없는 경우 가비지 수집 대상이 됩니다.
정적 필드 예외
그러나 정적 필드에는 중요한 예외가 있습니다. 활성 인스턴스의 참조로 더 이상 연결할 수 없더라도 해당 필드가 속한 클래스가 여전히 로드되어 있는 동안에는 가비지 수집을 위해 정적 필드를 선택할 수 없습니다. 이는 클래스의 특정 인스턴스가 사용 중인지 여부에 관계없이 언제든지 정적 필드에 액세스할 수 있기 때문입니다.
클래스 로더 역할
따라서 정적 필드는 해당 클래스를 로드한 클래스 로더에 연결됩니다. 클래스 로더가 가비지 컬렉터에 의해 회수되면 정적 필드를 보유하는 클래스를 포함하여 해당 클래스 로더에 의해 로드된 모든 클래스의 언로드가 트리거됩니다. 이는 결국 정적 필드를 가비지 수집에 적합하게 만듭니다.
실제 클래스 언로드
클래스 언로드는 Java Virtual Machine( JVM)이지만 특정 상황에서 발생할 수 있습니다. 예를 들어, 애플리케이션이 동적 클래스 로딩을 진행하고 사용되지 않는 클래스를 언로드하여 메모리 리소스를 확보할 때 이런 일이 발생할 수 있습니다.
결론
요약하면 정적 필드는 가비지가 될 수 없습니다. 자신이 속한 클래스가 로드되는 동안 수집됩니다. 해당 클래스 로더 자체가 가비지용으로 수집될 때만 수집될 수 있습니다. 이 동작을 통해 선언된 클래스를 사용할 수 있는 한 정적 필드에 계속 액세스할 수 있습니다.
위 내용은 Java 가비지의 정적 필드는 언제 수집됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!