Inhaltsverzeichnis
PHP的垃圾回收机制详解
Heim Backend-Entwicklung PHP-Tutorial PHP的垃圾回收机制详解_PHP教程

PHP的垃圾回收机制详解_PHP教程

Jul 13, 2016 am 10:10 AM
垃圾 机制

PHP的垃圾回收机制详解

最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制。本文参考了PHP手册。
 
在理解PHP垃圾回收机制(GC)之前,先了解一下变量的存储。
 
php中变量存在于一个zval的变量容器中。结构如下:
 
 
 
 
 
类型
 
 
is_ref
 
refcount
 
 
 
 
 
zval中,除了存储变量的类型和值之外,还有is_ref字段和refcount字段。
 
is_ref:是个bool值,用来区分变量是否属于引用集合。什么意思呢,你可以这么认为:表示变量是否有一个以上的别名。 
refcount:计数器,表示指向这个zval变量容器的变量个数。 
两者之间有这么一个默认关系:当refcount值为1时,is_ref的值为false。因为refcount为1,此变量不可能有多个别名,也就不存在引用了。
 
安装xdebug拓展之后,可以利用xdebug_debug_zval打印出zval容器详情。
 
这里有一点需要注意,将一个变量 = 赋值给另一个变量时,不会立即为新变量分配内存空间,而是在原变量的zval中给refcount加1。 只有当原变量或者发生改变时,才会为新变量分配内存空间,同时原变量的refcount减 1 。当然,如果unset原变量,新变量直接就使用原变量的zval而不是重新分配。
 
 &引用赋值时,原变量的is_ref 变为1,refcount 加1.  如果给一个变量&赋值,之前 = 赋值的变量会分配空间。
 
 
 
 
$a = 1;
xdebug_debug_zval('a');
echo PHP_EOL;
$b = $a;
xdebug_debug_zval('a');
echo PHP_EOL;
 
$c = &$a;
xdebug_debug_zval('a');
echo PHP_EOL;
 
xdebug_debug_zval('b');
echo PHP_EOL;
?>
  运行结果如下:
 
a:(refcount=1, is_ref=0),int 1
 
a:(refcount=2, is_ref=0),int 1
 
a:(refcount=2, is_ref=1),int 1
 
b:(refcount=1, is_ref=0),int 1
 
 
 
 
 
上面描述的zval存储的是标量,那复合类型的数组是如何存储的呢?
 
 
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
echo PHP_EOL;
class Test{
    public $a = 1;
    public $b = 2;
     
    function handle(){
        echo 'hehe';
    }
}
 
$test = new Test();
xdebug_debug_zval('test');
?>
  运行结果如下:
 
a:(refcount=1, is_ref=0),
 
array
  'meaning' => (refcount=1, is_ref=0),
string
 
'life' (length=4)
  'number' => (refcount=1, is_ref=0),
int
 
 42
test:(refcount=1, is_ref=0),
 
object(Test)[1]
  public 'a' => (refcount=2, is_ref=0),
int
 
 1
  public 'b' => (refcount=2, is_ref=0),
int
 
2
 
可以看出,数组用了比数组长度多1个zval存储。对象类似。下面给出了数组的存储形象表示
 
 
 
可以看到:数组分配了三个zval容器:a   meaning  number
 
现在看看所谓的环状引用是如何生成的
 
 
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
  运行结果:
 
a:(refcount=2, is_ref=1),
 
array
  0 => (refcount=1, is_ref=0),
string
 
 'one' (length=3)
  1 => (refcount=2, is_ref=1), &array
 
a 和 1 的zval容器 是一样的。如下:
 
 
 
 
 
 
 
这样就形成了环状引用。
 
在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refcount为0,那么变量的空间可以被释放,否则就不释放,这是一种非常简单的GC实现。
 
现在unset ($a),那么array的refcount减1变为1.现在无任何变量指向这个zval,而且这个zval的计数器为1,不会回收。
 
 
 
 
 
尽管不再有某个作用域中的任何符号指向这个结构(就是变量容器),由于数组元素“1”仍然指向数组本身,所以这个容器不能被清除 。因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏。庆幸的是,php将在请求结束时清除这个数据结构,但是在php清除之前,将耗费不少空间的内存。如果你要实现分析算法,或者要做其他像一个子元素指向它的父元素这样的事情,这种情况就会经常发生。当然,同样的情况也会发生在对象上,实际上对象更有可能出现这种情况,因为对象总是隐式的被引用。
 
 
 
如果上面的情况发生仅仅一两次倒没什么,但是如果出现几千次,甚至几十万次的内存泄漏,这显然是个大问题。在长时间运行的脚本,比如请求基本上不会结束的守护进程时,就会出现问题,内存空间会不断耗费,导致内存不足而崩溃。
 
 
 
PHP5.3中,采用了专门的算法(比较复杂)。,来处理环状引用导致内存泄露的问题。
 
当一个zval可能为垃圾时,回收算法会把这个zval放入一个内存缓冲区。当缓冲区达到最大临界值时(最大值可以设置),回收算法会循环遍历所有缓冲区中的zval,判断其是否为垃圾,并进行释放处理。或者我们在脚本中使用gc_collect_cycles,强制回收缓冲区中的垃圾。
 
在php5.3的GC中,针对的垃圾做了如下说明:
 
1:如果一个zval的refcount增加,那么此zval还在使用,肯定不是垃圾,不会进入缓冲区
 
2:如果一个zval的refcount减少到0, 那么zval会被立即释放掉,不属于GC要处理的垃圾对象,不会进入缓冲区。
 
 3:如果一个zval的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾,将其放入缓冲区。PHP5.3中的GC针对的就是这种zval进行的处理。
 
 
 
 
 
开启/关闭垃圾回收机制可以通过修改php配置实现,也可以在程序中使用gc_enable() 和 gc_disable()开启和关闭。
 
 
 
开启垃圾回收机制后,针对内存泄露的情况,可以节省大量的内存空间,但是由于垃圾回收算法运行耗费时间,开启垃圾回收算法会增加脚本的执行时间。
 
下面是php手册中给的一个脚本
 
 
class Foo
{
    public $var = '3.1415962654';
}
 
$baseMemory = memory_get_usage();
 
for ( $i = 0; $i
{
    $a = new Foo;
    $a->self = $a;
    if ( $i % 500 === 0 )
    {
        echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
    }
}
?>
  
 
针对这个脚本,给出了其在php5.2和5.3中内存的占用情况,如下图:
 
 
 
针对下面这个脚本
 
 
class Foo
{
    public $var = '3.1415962654';
}
 
for ( $i = 0; $i
{
    $a = new Foo;
    $a->self = $a;
}
 
echo memory_get_peak_usage(), "\n";
?>
  
 
开启垃圾回收机制,相对于不开启的时候,脚本执行时间增加了7%
 
通常,PHP中的垃圾回收机制,仅仅在循环回收算法确实运行时会有时间消耗上的增加。但是在平常的(更小的)脚本中应根本就没有性能影响。
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/938943.htmlTechArticlePHP的垃圾回收机制详解 最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制。本文参考了...
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Eine eingehende Untersuchung des Speicherorts und Mechanismus von Golang-Variablen Eine eingehende Untersuchung des Speicherorts und Mechanismus von Golang-Variablen Feb 28, 2024 pm 09:45 PM

Titel: Eine eingehende Untersuchung des Speicherorts und -mechanismus von Golang-Variablen Da die Anwendung der Go-Sprache (Golang) in den Bereichen Cloud Computing, Big Data und künstliche Intelligenz allmählich zunimmt, ist es besonders wichtig, eine fundierte Untersuchung durchzuführen. Tiefes Verständnis des Speicherorts und Mechanismus von Golang-Variablen. In diesem Artikel werden wir die Speicherzuweisung, den Speicherort und die damit verbundenen Mechanismen von Variablen in Golang ausführlich besprechen. Durch spezifische Codebeispiele hilft es den Lesern, besser zu verstehen, wie Golang-Variablen im Speicher gespeichert und verwaltet werden. 1.Speicher von Golang-Variablen

Tiefes Verständnis der Mechanismen der Neuberechnung und Darstellung von CSS-Layouts Tiefes Verständnis der Mechanismen der Neuberechnung und Darstellung von CSS-Layouts Jan 26, 2024 am 09:11 AM

CSS-Reflow und Repaint sind sehr wichtige Konzepte bei der Optimierung der Webseitenleistung. Bei der Entwicklung von Webseiten kann uns das Verständnis der Funktionsweise dieser beiden Konzepte dabei helfen, die Reaktionsgeschwindigkeit und das Benutzererlebnis der Webseite zu verbessern. Dieser Artikel befasst sich mit den Mechanismen des CSS-Reflows und Repaints und stellt spezifische Codebeispiele bereit. 1. Was ist CSS-Reflow? Wenn sich die Sichtbarkeit, Größe oder Position von Elementen in der DOM-Struktur ändert, muss der Browser die CSS-Stile neu berechnen und anwenden und dann das Layout neu gestalten

Schritt-für-Schritt-Anleitung zum Bereinigen von Systemmüll in Windows 10 Schritt-für-Schritt-Anleitung zum Bereinigen von Systemmüll in Windows 10 Jul 13, 2023 pm 09:53 PM

Wenn einige Benutzer Computer verwenden, bereinigt das Win10-System Müll. Wie sollten wir das Problem lösen, wenn das Win10-System Müll bereinigt? Heutzutage wissen immer noch viele Benutzer nicht, wie sie mit der Beseitigung von Müll im Win10-System umgehen sollen. Werfen wir also einen Blick auf die Schritt-für-Schritt-Anleitung zum Bereinigen von Systemmüll in Win10 sehen. 1. Klicken Sie auf dem Computer-Desktop auf „Dieser PC“ und verwalten Sie ihn. 2. Wählen Sie Datenträgerverwaltung. 3. Wählen Sie den Datenträger aus, den Sie bereinigen möchten, klicken Sie mit der rechten Maustaste und wählen Sie Eigenschaften. 4. Klicken Sie unten auf der Seite auf die Schaltfläche „Datenträgerbereinigung“. 5. Wählen Sie in der angezeigten Benutzeroberfläche die Dateien aus, die Sie bereinigen möchten, klicken Sie auf „OK“ und klicken Sie auf „Dateien löschen“. Das Obige ist eine Schritt-für-Schritt-Anleitung zum Bereinigen von Systemmüll in Windows 10. Ich hoffe

Autoloading-Mechanismus in PHP Autoloading-Mechanismus in PHP Jun 18, 2023 pm 01:11 PM

Da die PHP-Sprache immer beliebter wird, müssen Entwickler immer mehr Klassen und Funktionen verwenden. Wenn ein Projekt größer wird, wird es unpraktisch, alle Abhängigkeiten manuell einzuführen. Zu diesem Zeitpunkt ist ein automatischer Lademechanismus erforderlich, um den Codeentwicklungs- und Wartungsprozess zu vereinfachen. Der automatische Lademechanismus ist eine Funktion der PHP-Sprache, die erforderliche Klassen und Schnittstellen zur Laufzeit automatisch laden und die manuelle Einführung von Klassendateien reduzieren kann. Auf diese Weise können sich Programmierer auf die Entwicklung von Code konzentrieren und Fehler und Zeitverschwendung reduzieren, die durch mühsame manuelle Klasseneinführung entstehen. Im Allgemeinen in PHP

Analyse des impliziten Konvertierungsmechanismus in PHP Analyse des impliziten Konvertierungsmechanismus in PHP Mar 09, 2024 am 08:00 AM

Analyse des impliziten Konvertierungsmechanismus in PHP In der PHP-Programmierung bezieht sich die implizite Konvertierung auf den Prozess, durch den PHP automatisch einen Datentyp in einen anderen Datentyp konvertiert, ohne die Typkonvertierung explizit anzugeben. Der implizite Konvertierungsmechanismus ist in der Programmierung weit verbreitet, kann jedoch auch leicht zu unerwarteten Fehlern führen. Daher ist es für das Schreiben von robustem PHP-Code sehr wichtig, die Prinzipien und Regeln des impliziten Konvertierungsmechanismus zu verstehen. 1. Implizite Konvertierung zwischen Ganzzahl- und Gleitkommatypen In PHP ist die implizite Konvertierung zwischen Ganzzahl- und Gleitkommatypen sehr verbreitet. Wenn eine ganze Zahl

Wie verwende ich den Fehlerbehandlungsmechanismus in Go? Wie verwende ich den Fehlerbehandlungsmechanismus in Go? May 11, 2023 pm 04:45 PM

Als stark typisierte, effiziente und moderne Programmiersprache wird die Go-Sprache in der modernen Softwareentwicklung immer häufiger eingesetzt. Unter diesen ist der Fehlerbehandlungsmechanismus ein Aspekt der Go-Sprache, der Beachtung verdient, und der Fehlerbehandlungsmechanismus der Go-Sprache ist im Vergleich zu anderen Programmiersprachen ebenfalls sehr unterschiedlich und überlegen. In diesem Artikel werden die grundlegenden Konzepte, Implementierungsmethoden und Best Practices des Fehlerbehandlungsmechanismus in der Go-Sprache vorgestellt, um den Lesern zu helfen, den Fehlerbehandlungsmechanismus in der Go-Sprache besser zu verstehen und zu verwenden. 1. Die Grundkonzepte des Go-Sprachfehlerbehandlungsmechanismus in Go

Was ist der Speicherverwaltungsmechanismus in der Go-Sprache? Was ist der Speicherverwaltungsmechanismus in der Go-Sprache? Jun 10, 2023 pm 04:04 PM

Die Go-Sprache ist eine effiziente Programmiersprache, die häufig für die Programmierung auf Systemebene verwendet wird. Einer ihrer Hauptvorteile ist ihr Speicherverwaltungsmechanismus. Der integrierte Garbage-Collection-Mechanismus (GarbageCollection, kurz GC) in der Go-Sprache macht es für Programmierer überflüssig, Speicherzuweisungs- und Freigabevorgänge selbst durchzuführen, wodurch die Entwicklungseffizienz und die Codequalität verbessert werden. In diesem Artikel wird der Speicherverwaltungsmechanismus in der Go-Sprache ausführlich vorgestellt. 1. Go-Speicherzuweisung In der Go-Sprache verwendet die Speicherzuweisung zwei Heap-Bereiche: Small Object Heap (small

So bereinigen Sie Junk-Dateien in Win10. Erfahren Sie, wie Sie Junk-Dateien bereinigen und reparieren. So bereinigen Sie Junk-Dateien in Win10. Erfahren Sie, wie Sie Junk-Dateien bereinigen und reparieren. Jan 12, 2024 am 08:18 AM

Da der Computer über einen längeren Zeitraum verwendet wird, befinden sich immer mehr Junk-Dateien auf dem Laufwerk C. Das Vorhandensein von Junk-Dateien wirkt sich in gewissem Maße auf die Laufgeschwindigkeit des Systems aus, sodass sich der Computer immer langsamer anfühlt Damit der Computer reibungslos funktioniert, ist es nicht erforderlich, den normalen Betrieb zu beeinträchtigen. Im Folgenden zeigt Ihnen der Editor, wie Sie den Müll in Win10 bereinigen. Win10 ist ein neues System. Viele Benutzer haben jedoch kürzlich berichtet, dass die Systemfestplatte nach der Installation von Win10 immer langsamer wird. So bereinigen Sie Win10. Was ist mit Systemmüll? Im Folgenden erklärt Ihnen der Redakteur, wie Sie Ihr Win10-System vollständig bereinigen. So bereinigen Sie Junk auf dem Windows 10-Desktop

See all articles