일반 PHPs 메모리 관리에서 (또한, 마이크로 최적화를 인용 @ GordonM의 코멘트. 고개를 끄덕)는 모든 당신이 선언 변수와 사용을 위해 상자 밖으로 작동합니다. 개념 refcounting을 사용하면 PHP는 변수가 더 이상 사용되지 않는 것을 확인한 후 자동으로 정리합니다.
가비지 수집기는 객체에 순환 참조가있는 경우에만 유용합니다. A는 B를 가리키고 B는 A를 다시 가리 킵니다.이 경우 refcounting이 작동하지 않습니다.
잠재적으로 더 이상 사용되지 않는 가능성이있는 PHP 메모리에 정확히 10.000 개의 객체가있는 경우 PHP 가비지 수집기는 기본적으로 활성화되어 있으면 트리거합니다. 런타임에 gc_enable()
및 gc_disable()
을 사용하거나 사용하지 않도록 설정할 수 있습니다.
gc_collect_cycles()
으로 전화하여 이러한 개체를 수동으로 정리할 수도 있습니다.
하지만 필요한 경우이 프로세스를 최적화하는 방법은 무엇입니까? 주기 수집기를 실행하는 것이 효율적이거나 유용 할 필요는 없습니다. 10.000 잠재적 객체 중에서 많은 객체가 여전히 사용 중이므로 정리할 수 없습니다. 이 경우 CPU주기를 낭비하여 모든 객체를 검사하고 객체를 지우지 않기로 결정합니다. 이렇게하면 메모리가 줄어들지 않습니다.
일반적으로 GC는 장시간 실행되는 스크립트에서만 트리거되며 너무 많은 개체를 만들면 짧은 웹 요청에서 가끔 발생합니다.일반적으로 기본값에 대한 유즈 케이스의 99 %가 작동하기 때문에 이것에 대해서는 너무 많이 생각하지 않아야합니다.
"garbage_stats"PHP 확장을 사용하면 GC가 얼마나 효율적이고 빠르게 실행되었는지, 얼마나 많은 메모리를 줄일 수 있었는지에 대한 통계와 통계에 액세스 할 수 있습니다. (후크는 그 이후에만 사용할 수 있기 때문에)는 7 + PHP에서 작동 : https://github.com/tideways/php_garbage_stats 당신이 확장 기능을 설치 한 경우, 당신이 그들을 호출하여 CLI 스크립트에 대한 가비지 컬렉션 통계를 볼 수 있습니다
: A로부터
$ php -dgc_stats.enable=1 -dgc_stats.show_report=1 test.php
Found 7 garbage collection runs in current script.
Collected | Efficency% | Duration | Memory Before | Memory After | Reduction% | Function
----------|------------|----------|---------------|--------------|------------|---------
0 | 0.00 % | 0.01 ms | 365824 | 366320 | -0.14 % | gc_collect_cycles
10000 | 100.00 % | 2.75 ms | 4651320 | 491816 | 89.43 % | foo
10000 | 100.00 % | 3.54 ms | 4652784 | 493280 | 89.40 % | foo
10000 | 100.00 % | 2.11 ms | 4654248 | 494744 | 89.37 % | foo
10000 | 100.00 % | 3.26 ms | 4656168 | 496664 | 89.33 % | Test::foo
9000 | 90.00 % | 1.51 ms | 4694680 | 951176 | 79.74 % | Test::foo
10000 | 100.00 % | 3.11 ms | 5112272 | 952768 | 81.36 % | Test::foo
을 웹 (예 : Apache 또는 FPM) 요청의 경우, $runs = gc_stats();
기능을 사용하여이 정보에 액세스하여 로그 파일에 기록 할 수 있습니다.
이 정보를 바탕으로 다음과 같은 유일한 결정을 내릴 수 있습니다. 스크립트가 실행되는 효율성에 따라 스크립트에서 GC를 사용하거나 사용하지 않도록 설정합니다.
구성 지시문을 통해 수행 할 수있는 일은 많지 않습니다. 메모리 사용을 줄이는 방식으로 코드를 작성해야합니다. 그 자체로는 대부분의 "프로그래머"를위한 신비입니다. –
실제로 타격을주지 않는 한 메모리 소비 및/또는 GC 문제로 인한 성능 문제는 대부분의 경우에 대해 걱정하지 않으려 고합니다. [태그 : 마이크로 최적화] – GordonM