php5와 php7의 가비지 수집 메커니즘은 모두 참조 카운팅을 사용합니다.
참조 카운팅이란 무엇인가요?
PHP는 C로 작성되었기 때문에 C에는 구조체라는 것이 있습니다. C에서는 PHP 변수가 이런 방식으로 저장됩니다.
각 PHP 변수는 zval이라는 컨테이너에 존재합니다. zval 컨테이너에는 변수 이름과 값 외에도 2바이트의 추가 정보가 포함되어 있는데, 이는 A Boolean입니다. 값은 이 변수가 참조 컬렉션에 속하는지 여부를 나타내는 데 사용됩니다. 이 바이트를 통해 일반 변수를 PHP의 참조 변수와 구별할 수 있습니다. 두 번째 추가 바이트는 이 컨테이너를 가리키는 변수를 나타내는 데 사용됩니다. 숫자.
PHP5의 출력:
person: (refcount=1, is_ref=0), array (size=2) 'name' => (refcount=1, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19
PHP7의 출력:
person: (refcount=2, is_ref=0) array (size=2) 'name' => (refcount=1, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19#🎜🎜 # 복잡한 데이터 유형의 경우 PHP5와 PHP7의 참조 계산 알고리즘이 다르다는 것을 알 수 있습니다. 순환 참조 상황을 시도해 보겠습니다. 위 코드를 기반으로 한 줄의 코드를 추가합니다.
$person['hello'] = $person['name']
출력:
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
PHP5 출력:
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
요약: #🎜 🎜# PHP5와 PHP7의 가비지 수집 메커니즘은 모두 참조 계산에 속하지만 복잡한 데이터 유형의 알고리즘 처리 측면에서 zval은 PHP7에서 새로운 구현을 갖습니다. 가장 기본적인 변화는 *zval에 필요한 메모리가 더 이상 힙과 별도로 할당되지 않으며 참조 카운트가 더 이상 자체적으로 저장되지 않는다는 것입니다. 문자열, 배열, 객체 등 복잡한 데이터 유형의 참조 횟수는 자체적으로 저장됩니다.
이 구현에는 다음과 같은 이점이 있습니다.1. 단순 데이터 유형은 메모리를 별도로 할당할 필요도 없고 할당할 필요도 없습니다. #🎜 🎜#
2. 더 이상 중복 계산이 발생하지 않습니다. 객체에서는 객체 자체에 저장된 개수만 유효합니다. 3. 이제 개수는 값 자체로 저장되므로 다음과 같은 zval이 아닌 구조의 데이터와 공유할 수 있습니다. zval과 해시테이블 키 사이. 추천 튜토리얼:PHP7 튜토리얼
위 내용은 php7 가비지 수집과 php5의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!