>백엔드 개발 >PHP 튜토리얼 >PHP: 간단한 단어로 설명되는 가비지 컬렉터

PHP: 간단한 단어로 설명되는 가비지 컬렉터

Linda Hamilton
Linda Hamilton원래의
2024-11-29 00:46:11809검색

가비지 컬렉터(GC)는 PHP의 내부 메모리 관리 시스템이지만 이해해야 할 몇 가지 미묘한 부분이 있습니다.

? GC가 존재하는 이유는 무엇입니까?

GC는 메모리 관리를 자동화하여 지루한 수동 작업으로 메모리를 처리해야 하는 번거로움을 없애줍니다.

이를 통해 개발자는 '메모리 부족' 오류에 대해 지나치게 걱정하지 않고 비즈니스 로직에 집중할 수 있습니다.

물론 마법은 아닙니다.

? 짧게 말하면 10,000개 개체

더 이상 필요하지 않은 개체를 해제하면 메모리 누수를 방지할 수 있습니다.

GC는 계산 메커니즘을 사용하여 삭제할 요소를 결정합니다. 특정 개체를 가리키는 참조가 없으면(예: $counter = 0) 이 개체는 정리 대상입니다.

매우 잘 작동하지만 일부 참조에는 문제가 있을 수 있습니다.

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

이 잘못된 설계의 경우, $a와 $b가 서로 참조하므로 설정을 해제하더라도 PHP는 메모리를 해제하지 않으므로 PHP는 이들이 여전히 사용 중이라고 믿게 됩니다.

다행히 이를 위한 Cycle Collector라는 또 다른 메커니즘이 있습니다.

gc_collect_cycles();

대략 말하면 컬렉터는 모든 참조를 순회하고 알고리즘을 적용하여 사용 중인 개체를 표시하고 수집할 개체(표시되지 않은 개체)를 표시합니다.

그러나 PHP는 잠재적인 순환 참조가 있는 객체 10,000개의 임계값에 도달할 때까지 자동 순환 수집을 트리거하지 않습니다.

다시 말하지만 이것은 마법이 아니므로 몇몇 경우에만 gc_collect_cycles()를 호출해야 합니다.

? 탄스타플

잘못된 디자인은 객체 간의 관계를 지나치게 복잡하게 만들어 더 많은 참조와 더 빈번한 가비지 수집으로 이어질 수 있습니다.

참조 카운트된 각 객체에는 참조 카운트를 위한 추가 저장소가 필요합니다.

출처: Wikipedia - 참조 횟수

메모리 정리 작업과 관련된 오버헤드는 글로벌 성능에 큰 영향을 미치고 궁극적으로 특정 시나리오에서 실행 시간을 늘릴 수 있습니다.

10년 전 Composer는 gc_disable() 함수를 사용하여 성능이 크게 향상되었습니다.

출처: Composer - GC 비활성화

실제로 PHP 7에서는 GC가 대폭 향상되어 2014년과 같지 않습니다.

또한 PHP 8 버전에서는 메모리 할당 전략이 개선되었으며 더 나은 모니터링을 위해 GC 작업에 대한 유용한 통계가 추가되었습니다(8.3의 gc_status()).

대부분의 PHP 애플리케이션은 요청 기반이며 요청이 끝나면 메모리가 자동으로 지워집니다.

다시 말하지만, 꽤 멋지지만 마술은 아닙니다. 비동기식 요청과 수명이 긴 개체/데몬은 어떻게 되나요?

어떤 시점에서는 메모리 누수가 발생할 수 있습니다.

? PHP의 GC는 얼마나 다릅니까?

이 시점에서는 PHP의 GC가 다른 언어와 어떻게 다른지 알지 못할 수도 있습니다.

대부분의 경우 다른 언어에서는 가비지 수집을 위해 참조 계산에 의존하지 않거나 다른 구현을 사용할 수 있습니다.

예를 들어, 많은 사람들은 사용되지 않은 객체를 표시하지만 증분적으로 작동하지 않는 추적 알고리즘을 사용합니다. 그래프 순회입니다.

게다가 일부 언어에서는 이러한 직접적인 제어(예: 런타임 시 켜기/끄기)를 허용하지 않습니다.

늘 그렇듯이 장점도 있고 불편한 점도 있기 때문에 하이브리드 방식을 보실 수도 있습니다.

?‍? PHP의 GC와 상호작용

내장된 gc_* 도우미를 활용할 수 있습니다.

예:

  • gc_collect_cycles는 가비지 수집을 수동으로 트리거합니다
  • gc_status()는 현재 상태를 제공합니다
  • gc_disable()은 비활성화합니다
  • gc_enable()을 사용하면

이러한 기능은 필요할 때 디버깅하거나 가비지 수집을 미세 조정하는 데 유용합니다.

? 메모리 오류 이해

이 게시물을 읽고 더 많은 정보를 얻을 수 있습니다.

PHP: The Garbage Collector explained with simple words

PHP: 메모리 오류

spO0q ? ・ '23년 5월 24일

#php #초보자 #프로그램 작성

? 약한 지도가 도움이 될까요?

PHP 7.4에서는 약한 참조가 도입되었고 PHP 8에서는 약한 맵이 도입되었습니다.

약한 지도는 약한 참조의 모음이라고 설명할 수 있습니다.

이 데이터 구조는 PHP가 복잡해지거나 과도한 공간을 차지하지 않고 항목을 추적하는 데 도움이 되는 다목적 키-값 저장소입니다.

가비지 수집을 막을 수 있는 [강력한] 참조가 없기 때문에 더 이상 필요하지 않을 때 즉시 지워지는 임시 저장소라고 볼 수 있습니다.

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

✅ 장점

  • 매우 간단합니다
  • 캐싱 또는 메모에 적합(예: 비용이 많이 드는 계산)

❌ 단점

  • 키(객체)는 가비지 수집을 방지하지 않지만 값은 방지할 수 있으므로 "임의의 값"이라는 용어는 오해를 불러일으킬 수 있습니다(간단한 데이터 유형만 값으로 사용)
  • 가치 있는 사용 사례는 제한되어 있습니다

? 코드 최적화

  • 상호의존성을 줄이는 디자인 패턴 활용
  • 의존성 주입 사용
  • 너무 큰 데이터 세트를 메모리에 로드하지 말고 거대한 배열 대신 컬렉션과 생성기를 사용하세요
  • 메모리 사용량 모니터링
  • 측정항목으로 코드 프로파일링
  • gc_enable(), gc_disable() 및 gc_collect_cycles()를 드물게 사용하세요

마무리

대부분의 경우 PHP가 이미 메모리 관리를 처리하므로 메모리 관리에 대해 걱정할 필요가 없습니다.

그러나 최신 스택은 수명이 긴 객체를 활용하므로 잠재적인 메모리 누수가 있는지 애플리케이션을 모니터링해야 합니다.

문제가 발생하면 코드를 최적화하거나 GC와 직접 상호작용해야 할 수도 있습니다.

위 내용은 PHP: 간단한 단어로 설명되는 가비지 컬렉터의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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