>  기사  >  Java  >  Java에서는 가비지 수집 및 객체 수명 주기를 자세히 설명합니다.

Java에서는 가비지 수집 및 객체 수명 주기를 자세히 설명합니다.

高洛峰
高洛峰원래의
2017-01-17 15:50:541460검색

Java 가비지 컬렉션과 객체 수명주기에 대한 자세한 설명

Java의 가비지 컬렉션과 객체 라이프사이클

1. 가비지 컬렉션

가비지 컬렉션은 Java의 메모리입니다. 프로그래밍 관리의 핵심 개념인 JVM의 메모리 관리 메커니즘을 가비지 수집 메커니즘이라고 합니다.

객체가 생성된 후 JVM의 힙 메모리에 배치됩니다. 이 객체가 참조되지 않으면 힙 메모리에서 JVM에 의해 재활용됩니다. 생성된 객체는 복제할 수 없으며, 프로그램 명령문을 통해 해제할 수 있는 방법이 없습니다. 즉, JVM 런타임 공간의 루트 컬렉션을 통해 객체에 도달(발견)할 수 없는 경우 해당 객체를 가비지 객체라고 합니다. 루트 컬렉션은 클래스의 정적 참조 필드와 로컬 참조 필드로 구성됩니다. JVM은 루트 컬렉션을 통해 객체를 인덱싱합니다.

Java 애플리케이션을 개발할 때 JVM에서 관리하는 두 가지 유형의 메모리인 힙 메모리와 스택 메모리가 자주 사용됩니다. 간단히 말해서, 힙 메모리는 주로 런타임 시 프로그램에 의해 생성되거나 인스턴스화되는 개체 및 변수를 저장하는 데 사용됩니다. 예를 들어 new 키워드를 통해 생성된 개체입니다. 스택 메모리는 프로그램 코드에서 정적 또는 비정적으로 선언된 메서드를 저장하는 데 사용됩니다.

(1) 힙 메모리

힙 메모리는 JVM이 시작될 때 생성됩니다. 힙 메모리에 저장된 객체는 JVM에 의해 자동으로 재활용될 수 있으며 다른 외부 수단으로는 재활용될 수 없습니다. 개발자는 관련 코드를 추가하여 힙 메모리의 개체를 회수할 수 없습니다. 힙 메모리는 일반적으로 새 개체 영역과 이전 개체 영역의 두 가지 영역으로 나뉩니다.

새로운 개체 영역: Eden 영역, From 영역 및 To 영역의 세 가지 작은 영역으로 세분화될 수 있습니다. Eden 영역은 새로 생성된 객체를 저장하는 데 사용되며 스택에 대한 포인터가 커지는 것처럼 새 객체가 생성됩니다. 섹스 테스트의 임무는 루트 컬렉션에서 도달할 수 없는 객체를 감지하는 것입니다. 이러한 객체는 JVM에 의해 재활용될 수 있으며 모든 활성 객체는 Eden 영역에서 To 영역으로 복사됩니다. 일부 객체는 To 영역에서 From 영역으로 전송됩니다. 위의 객체 마이그레이션 전체 프로세스는 JVM에 의해 제어됩니다.

이전 개체 영역: 이전 개체 영역의 개체는 여전히 긴 수명 주기를 갖습니다. 대부분의 JVM 시스템 가비지 개체는 일정 기간이 지나면 "단기 수명" 개체에서 발생합니다. 오래된 개체 영역은 쓰레기 개체가 됩니다. 이때 JVM 시스템은 이러한 가비지 개체를 자동으로 재활용합니다. 가비지 수집 작업을 완료하기 위해 JVM이 제한된 시스템 리소스를 사용하기 때문에 시스템이 자주 가비지 수집을 수행하도록 하지 않는 것이 좋습니다. 첫째, 애플리케이션의 결과 사용자 측의 요청에 신속하게 응답할 수 없으면 시스템의 전반적인 성능에 영향을 미치게 됩니다.

(2) 스택 메모리

힙 메모리는 주로 런타임 중에 프로그램이 생성하거나 인스턴스화한 개체 및 변수를 저장하는 데 사용됩니다. 예를 들어 new 키워드를 통해 생성된 개체입니다. 스택 메모리는 프로그램 코드에서 정적 또는 비정적으로 선언된 메서드를 저장하는 데 사용됩니다.

2. JVM의 객체 라이프사이클

JVM 런타임 공간에서 객체의 전체 라이프사이클은 대략 7단계로 나눌 수 있습니다.

생성 단계 ;

적용 단계;

도달할 수 없는 단계;

최종 단계; >

릴리스 단계

위의 7단계는 JVM 개체의 전체 수명 주기를 구성합니다.

(1) 생성 단계

객체 생성 단계에서 시스템은 주로 다음 단계를 통해 객체 생성 프로세스를 완료합니다.

f35d6e602fd7d0f0edfa6f7d103c1b57

          2cc198a1d5eb0d3eb508d858c9f5cbdb 슈퍼 클래스의 생성자를 재귀적으로 호출합니다.

43ad812d3a971134e40facaca816c822 호출됩니다.

객체를 생성할 때 몇 가지 주요 적용 규칙에 주의해야 합니다.




& lt; 2 & gt; 해당 물건이 제때에 쓰레기 재활용 기준을 충족하도록 노력하세요. 예를 들어 myObject = null입니다.
& lt; 3 & gt; 너무 깊은 상속 수준을 채택하지 마세요.

                                                                                                                                                                                                                 지역 변수에 액세스하는 것이 클래스에서 액세스하는 것보다 낫습니다.


(2) 신청단계

개체 참조 단계에서 개체는 다음과 같은 특성을 갖습니다.

f35d6e602fd7d0f0edfa6f7d103c1b57 시스템은 개체에 대해 하나 이상의 강력한 참조(Strong Reference)를 유지합니다. > ; 객체에 대한 모든 참조는 강력한 참조입니다(명시적으로 적용하지 않는 한: 소프트 참조, 약한 참조 또는 팬텀 참조).

강한 참조(강한 참조): 모든 경로를 탐색하는 JVM 메모리 관리자를 나타냅니다. 루트 참조 컬렉션부터 시작하는 힙의 개체입니다. 개체에 대한 경로에 참조 개체가 포함되어 있지 않은 경우 개체에 대한 참조를 강력한 참조라고 합니다.

소프트 참조: 소프트 참조의 주요 특징은 강력한 참조 기능입니다. 이러한 유형의 메모리는 메모리가 충분하지 않은 경우에만 회수되므로 일반적으로 메모리가 충분할 때 회수되지 않습니다. 또한 이러한 참조 객체는 Java가 OutOfMemory 예외를 발생시키기 전에 null로 설정되도록 보장됩니다. 일반적으로 사용되는 일부 리소스를 캐시하고 Cache 기능을 구현하여 OutOfMemory를 발생시키지 않고 메모리 사용을 최대화하는 데 사용할 수 있습니다.

다음은 소프트 참조 구현 코드입니다.

        import java.lang.ref.SoftReference;
        ...
          
        A a = new A();
        ...
 
        // 使用a
        ...
          
        // 使用完了a, 将它设置为soft引用类型,并且释放强引用
        SoftReference sr = new SoftReference(a);
        a = null;
        ...
 
        // 下次使用时
  if (sr != null) {
  a = sr.get();
} else {
  // GC由于低内存,已释放a,因此需要重新装载
          a = new A();
  sr = new SoftReference(a);
}

소프트 참조 기술의 도입으로 Java 애플리케이션은 메모리 관리를 개선하고 시스템을 안정화하며 시스템 메모리 오버플로를 방지하고 시스템 충돌을 방지할 수 있습니다. . 따라서 메모리를 많이 차지하고 Life Cycle이 길지만 자주 사용되지 않는 객체를 다룰 때 이 기술을 최대한 적용해야 한다. 시스템 안정성을 향상시킵니다.

약한 참조: 약한 응용 프로그램 객체와 소프트 참조 객체의 가장 큰 차이점은 GC가 가비지 수집을 수행할 때 소프트 응용 프로그램 객체의 재활용 여부를 확인하는 알고리즘을 사용해야 한다는 것과 약한 참조에 대한 것입니다. , GC는 항상 수집합니다. 약한 참조 객체는 GC에서 재활용하기가 더 쉽고 빠릅니다. 약한 참조 객체는 맵 구조에서 자주 사용됩니다.

import java.lang.ref.WeakReference;  
                ...  
                  
               A a = new A();  
               ...  
  
               // 使用a  
               ...  
                  
               // 使用完了a, 将它设置为Weak引用类型,并且释放强引用  
               WeakReference wr = new WeakReference(a);  
               a = null;  
                ...  
               // 下次使用时  
       if (wr != null) {  
         a = wr.get();  
      } else {  
                  a = new A();  
        wr = new WeakReference(a);  
    }

Phantom Reference: Phantom Reference는 용도가 적고 주로 finalize 기능 사용을 지원하는 데 사용됩니다.

팬텀 참조 객체는 종료 기능을 완료하여 도달할 수 없지만 아직 GC에서 재활용되지 않은 객체를 말합니다. 이러한 종류의 객체는 나중에 재활용 작업을 마무리하는 데 도움이 될 수 있습니다. 참조의 clear() 메서드를 다루어 자원 재활용 메커니즘의 유연성을 향상했습니다.

실제 프로그래밍에서는 약한 참조와 가상 참조가 거의 사용되지 않습니다. 소프트 참조는 JVM의 가비지 메모리 복구 속도를 높이고 시스템 보안을 유지할 수 있기 때문입니다. 메모리 오버플로(OutOfMemory) 등이 발생하지 않습니다.

(3) Invisible 단계

객체가 Invisible 단계에 있다는 것은 더 이상 코드의 다른 영역에서 참조할 수 없고 해당 Strong Reference가 사라진다는 의미입니다. 예를 들어 지역 변수는 가시적인
범위를 초과합니다.

try {  
      Object localObj = new Object();  
  localObj.doSomething();  
   } catch (Exception e) {  
     e.printStackTrace();  
   }  
  
   if (true) {  
  // 此区域中localObj 对象已经不可视了, 编译器会报错。  
  localObj.doSomething();  
   }

(4) 도달 불가능 단계

도달 불가능 단계의 객체는 더 이상 가상 머신의 객체 참조 루트 컬렉션에서 직접 또는 간접적인 강력한 참조를 찾을 수 없습니다. 모든 스레드 스택의 임시 변수. 로드된 모든 정적 변수 또는 네이티브 코드 인터페이스에 대한 참조입니다.

(5) 수집 가능 단계, 최종 단계 및 릴리스 단계

개체가 수집 가능 단계, 최종 단계 및 릴리스 단계에 있을 때 개체는 다음 세 가지 상황을 갖습니다. 🎜>
  f35d6e602fd7d0f0edfa6f7d103c1b57 수집가가 해당 개체에 더 이상 접근할 수 없음을 발견했습니다.

2cc198a1d5eb0d3eb508d858c9f5cbdb finalize 메소드가 실행되었습니다.

  5bdf4c78156c7953567bb5a0aef2fc53 개체 공간이 재사용되었습니다.

읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!


Java의 가비지 수집 및 개체 수명 주기에 대한 자세한 설명에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.