PHP는 참조 카운팅과 쓰기 시 복사를 사용하여 메모리를 관리합니다. 쓰기 중 복사는 변수 간 값 복사로 인해 메모리가 낭비되지 않도록 보장하고, 참조 카운팅은 변수가 더 이상 필요하지 않을 때 메모리가 운영 체제에 해제되도록 보장합니다.
PHP 메모리 관리를 이해하려면 먼저 기호 테이블이라는 개념을 이해해야 합니다.
심볼테이블의 개념:
변수는 변수 이름과 변수 값의 두 부분으로 구성됩니다. 심볼 테이블은 변수 이름을 메모리의 변수 값 주소에 매핑하는 배열입니다.
쓰기 시 복사:
한 변수의 값이 다른 변수에 복사될 때 PHP는 복사된 값에 대해 더 많은 메모리를 사용하지 않습니다. 대신, 두 변수가 동일한 메모리 블록에 속함을 나타내기 위해 새로운 기호 테이블을 추가합니다. 따라서 다음 코드는 실제로 새 배열을 생성하지 않습니다.
$people = array( "앨리스","밥" );
$other = $people; //배열은 복사되지 않습니다
?>
복사본을 수정하면 PHP는 복사본을 만드는 데 필요한 메모리를 할당합니다.
$people[ 1 ] = "Tom"; //값이 변경되고 배열이 복사되며 새 메모리가 할당됩니다.
PHP는 할당 및 복사를 지연함으로써 많은 상황에서 시간과 메모리를 절약합니다.
참조수:
기호 테이블의 각 위치에는 참조 카운터가 있으며, 그 값은 해당 메모리 조각을 얻는 방법의 수를 나타냅니다.
초기화하고 $people과 $other에 값을 할당한 후 배열은 심볼 테이블을 가리키며 $people과 $other의 참조 카운터 값은 2가 됩니다. 즉, 두 가지 방법이 있습니다. 해당 메모리 조각인 $people 및 $other 를 얻으세요.
그러나 $people[1]이 변경되면 PHP는 $people에 대한 새 배열을 생성합니다. 이때 $people과 $other의 참조 카운터 값은 모두 1입니다. 변수가 범위를 벗어날 때. 예를 들어, 함수 매개변수와 지역 변수가 함수의 끝에 도달하면 응용 카운터의 값이 1씩 감소합니다. 변수에 다른 메모리 공간의 값이 할당되면 이전 값의 참조 횟수가 1씩 감소합니다. . 참조 카운트가 0이 되면 메모리가 해제됩니다.
이것은 참조 카운팅입니다.
참조 카운팅은 선호되는 메모리 관리 방법입니다. 함수 내에서 변수 범위를 유지하고 값으로 전달하며 참조 계산으로 메모리 관리를 처리하도록 합니다. 더 많은 정보를 적극적으로 얻거나 변수 값을 해제하도록 제어하려면 isset() 및 unset() 함수를 사용할 수 있습니다.
위 내용은 PHP 가비지 수집 메커니즘(기록 중 복사 및 참조 계산)을 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.