php7垃圾回收机制浅析

今天本来想着了解下php的垃圾回收机制,看了下php手册里的描述,大致了解了垃圾回收机制的原理,想着自己写代码去测试下,是不是跟手册里说的是一样的。然后就有了这篇文章。

发现问题

按照手册的实例代码敲了下,发现了神奇的问题,结果不一样啊!

$a = "new String";
xdebug_debug_zval( 'a' );

手册告诉我们的结果是:

a: (refcount=1, is_ref=0)='new string'

我自己的结果:

a: (interned, is_ref=0)='new String'

这个是什么东东?
原来我的PHP版本是7.1,但是手册上是5.3的。那我明白了,PHP7在垃圾回收机制上做了优化。如果我是大牛,我就去看源码了,可惜我不是!所以咱只能查资料了,找了大半天,发现很多标题都是PHP7垃圾回收机制的文章,但是里面的内容确还是PHP5的垃圾回收机制的内容,要么就是直接上源码!这。。。我要是能看懂源码,还需要你去复制一遍吗?
经过坚持不懈的搜索,查找到了这篇文章---PHP7中zval的变化

解决问题

原文:
In PHP 7 a zval can be reference counted or not. There is a flag in the zval structure which determined this.

There are some types which are never refcounted. These types are null, bool, int and double.

There are other types which are always refcounted. These are objects, resources and references.

And then there are types, which are sometimes refcounted. Those are strings and arrays.

For strings the not-refcounted variant is called an “interned string”. If you’re using an NTS (not thread-safe) PHP 7 build, which you typically are, all string literals in your code will be interned. These interned strings are deduplicated (i.e. there is only one interned string with a certain content) and are guaranteed to exist for the full duration of the request, so there is no need to use reference counting for them. If you use opcache, these strings will live in shared memory, in which case you can’t use reference counting for them (as our refcounting mechanism is non-atomic). Interned strings have a dummy refcount of 1, which is what you’re seeing here.

For arrays the not-refcounted variant is called an “immutable array”. If you use opcache, then constant array literals in your code will be converted into immutable arrays. Once again, these live in shared memory and as such must not use refcounting. Immutable arrays have a dummy refcount of 2, as it allows us to optimize certain separation paths.
翻译:
在PHP7中,zval结构体中有一个标志来决定zval是否能被引用计数。
像null,bool,int,double这些变量类型永远不会被引用计数(这个地方可能有些不太严谨,鸟哥的博客中写道PHP7中zval的类型共有18种,其中IS_LONG,IS_DOUBLE,IS_NULL,IS_FALSE,IS_TRUE不会使用引用计数)。
像object,resources,references这些变量类型总是会使用引用计数。
然而,像array,strings这些变量类型有时会使用引用计数,有时则不会。
不使用引用计数的字符串类型被叫做“interned string(保留字符串)”。如果你使用一个NTS(非线程安全)的PHP7来构建,通常情况下,代码中的所有字符串文字都将是限定的。这些保留字符串都是不可重复的(即,只会存在一个含有特定内容的保留字符串)。它会一直存在直到请求结束时才销毁,所以也就无需进行引用计数。如果使用了 opcache 的话,保留字符会被存储在共享内存中,在这种情况下,无法使用引用计数(因为我们引用计数的机制是非原子的)。保留字符串的伪引用计数为1。
对于数组来说,无引用计数的变量称为“不可变数组”。如果使用opcache,则代码中的常量数组文字将转换为不可变数组。同样的,他们存在于共享内存中,因此不得使用引用计数。不可变数组的伪引用数为2,因为它允许我们优化某些分离路径。

总结

PHP7的垃圾回收机制已经做过了优化。当有人问我们PHP垃圾回收机制的时候,我们不能再按手册上解释的那样去回答,而是要分版本去解释,当然,这篇只是简单的解释了PHP7中zval的变化,暂时没有办法去深入的解释PHP7的垃圾回收机制。主要原因还是咱的技术水平还有待提高,源码解释那部分看的云里雾里的,还需要更多时间去学习,以后会看懂了再来填这个坑吧。这篇文章主要先做个mark。当然也希望有能力的大佬看到的话,可以指教一下我

参考资料

PHP7中zval的变化
[转]变量在 PHP7 内部的实现(一)
[转]变量在PHP7内部的实现(二)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,156评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,401评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,069评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,873评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,635评论 6 408
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,128评论 1 323
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,203评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,365评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,881评论 1 334
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,733评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,935评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,475评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,172评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,582评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,821评论 1 282
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,595评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,908评论 2 372

推荐阅读更多精彩内容