CodeGym/Java Course/모듈 3/Java의 가비지 컬렉션

Java의 가비지 컬렉션

사용 가능

Java에서 가비지 수집이 무엇인지 기억하십시오.

가비지 수집은 사용하지 않는 개체를 삭제하여 전체 런타임 메모리를 회수하는 프로세스입니다.

때때로 프로그래머는 쓸모없는 객체를 파괴하는 것을 잊고 할당된 메모리가 해제되지 않을 수 있습니다. 점점 더 많은 시스템 메모리가 소비되고 결국에는 더 이상 할당되지 않습니다. 이러한 응용 프로그램은 "메모리 누수"로 인해 어려움을 겪습니다.

특정 시점 이후에는 더 이상 새 객체를 생성할 메모리가 부족하고 OutOfMemoryError 로 인해 프로그램이 비정상적으로 종료됩니다 .

Java의 가비지 수집은 Java 프로그램이 자동으로 메모리를 관리하는 프로세스입니다. Java 프로그램은 JVM(Java Virtual Machine)에서 실행되는 바이트코드로 컴파일됩니다.

Java 프로그램이 JVM에서 실행될 때 객체는 객체에 할당된 메모리 부분인 힙에 생성됩니다.

Java 응용 프로그램이 실행되는 동안 새 개체가 생성됩니다. 결국 일부 개체는 더 이상 필요하지 않습니다. 주어진 시간에 힙 메모리는 두 가지 유형의 개체로 구성되어 있다고 말할 수 있습니다.

  • 라이브 - 이 개체는 사용되며 다른 곳에서 참조됩니다.
  • Dead - 이 개체는 다른 곳에서는 사용되지 않으며 해당 개체에 대한 참조가 없습니다.

가비지 수집기는 이러한 사용되지 않는 개체를 찾아 제거하여 메모리를 확보합니다.

Java의 가비지 수집은 자동 프로세스 입니다 . 프로그래머는 삭제할 개체를 명시적으로 표시할 필요가 없습니다.

각 JVM은 자체 버전의 가비지 수집을 구현할 수 있습니다. 그러나 수집기는 도달할 수 없는 개체를 표시하거나 식별하고 압축을 통해 제거하기 위해 힙 메모리에 있는 개체를 처리하기 위한 표준 JVM 사양을 준수해야 합니다.

객체 접근성

객체를 살아있는 것으로 인식하기 위해서는 링크의 존재만으로는 충분하지 않습니다. 이는 일부 죽은 개체가 다른 죽은 개체를 참조할 수 있기 때문입니다. 그렇기 때문에 개체에 대한 모든 참조 중에서 "활성" 개체에서 적어도 하나가 있어야 합니다.

객체 접근성

가비지 컬렉터는 살아 있는 객체와 죽은 객체를 구별하기 위해 GC 루트( 가비지 컬렉션 루트 ) 의 개념으로 작동합니다 . 100% 라이브 개체가 있으며 다른 개체에 애니메이션을 적용하는 링크 등이 있습니다.

그러한 뿌리의 예:

  • 시스템 클래스 로더에 의해 로드되는 클래스.
  • 라이브 스트림.
  • 현재 실행 중인 메소드 및 지역 변수의 매개변수.
  • 동기화를 위한 모니터로 사용되는 개체입니다.
  • 어떤 목적을 위해 가비지 수집에서 유지되는 개체입니다.
  • 가비지 수집기는 이러한 루트에서 시작하여 다른 개체에 대한 참조를 따라 메모리에 있는 개체의 전체 그래프를 살펴봅니다.

Java의 가비지 수집 단계

표준 가비지 수집 구현에는 세 단계가 있습니다.

1. 개체를 라이브로 표시

이 시점에서 가비지 수집기(GC)는 개체 그래프를 순회하여 메모리에 있는 모든 살아있는 개체를 식별해야 합니다.

개체를 방문하면 개체를 사용 가능한 것으로 표시하므로 활성 상태입니다. GC 루트에서 액세스할 수 없는 모든 개체는 가비지 수집 후보로 간주됩니다.

2. 죽은 물건 치우기

마크업 단계 후 메모리 공간은 살아있는(방문한) 객체 또는 죽은(방문하지 않은) 객체가 차지합니다. 정리 단계에서는 이러한 죽은 개체가 포함된 메모리 조각을 해제합니다.

3. 메모리에 남아있는 객체의 컴팩트한 배열

이전 단계에서 제거된 죽은 개체가 서로 옆에 있을 필요는 없습니다. 따라서 조각난(절반 비어 있는) 메모리 공간이 생길 위험이 있습니다.

그러나 물론 이를 제공하면 가비지 수집기가 죽은 개체를 제거하는 순간 메모리를 압축할 수 있습니다. 나머지는 힙 시작 부분의 연속 블록에 위치합니다.

압축 프로세스를 사용하면 새 개체에 대한 메모리를 순차적으로 할당하기가 더 쉬워집니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다