垃圾回收二

原创 2016年05月30日 09:48:36

上篇文章讲到了PHP的垃圾回收机制,但是引用计数这种垃圾回收机制是无法回收循环引用这种垃圾的,所以在新的版本中,PHP引入了一种新的垃圾回收机制,这个回收机制的具体实现在上文中已经大概讲过了。

 

当一个变量在被销毁的时候,如果引用计数大于1的话,那么就会将这个变量保存到缓存区中,并且标记为紫色。

 

当在某个一个点上,有个新的变量被加入到缓存区的时候,并且这个时候缓冲区满了,这个时候就会触发回收机制了。标记回收有一个明显的缺点就是回消耗大量的时候回收,所以通常这个回收机制会导致程序会有几秒到几十秒的卡顿。

 

这个回收机制是首先,扫描整个缓存区。如果该变量还存在符号表中,则将其设置为黑色。如果不存在符号表中,则将其引用计数减1,同时设置为灰色。

比如下面的数组a:


1、  没加入缓冲区前,数组a引用计数为3

2、  A的引用计数被减1,这个时候为2,判断大于0,加入到缓存区中,并标记为紫色

3、  有新节点加入,缓冲区满了无法加入,触发回收机制

4、  判断a是否在符号表中,是的话标记为黑色。这里a不存在符号表中,所以会遍历a中所有的元素,将a中所有不存在符号表的元素的引用计数都减1。这里a的0和1都不存在符号表中,因此减去两次,就变成了0。同时将a设置为灰色。

5、  再扫描一次缓存区。将引用计数大于0的设置为黑色。

6、  再扫描一次缓存区,将黑色的引用计数恢复加上去1,然后设置为白色。

7、  回收那些不是白色的变量。到这里,a就被回收了。

 

 

这里使用这些颜色,我觉得有两个目的:

一来是为了防止重复。比如在将某个变量加入到缓存区的时候,如果这个变量所对应的结构已经被标记为紫色,那么就不用再加入到缓存区中了,因为他已经存在在缓存区了。

二来是为了将其作为状态的转移。

相关文章推荐

JVM学习笔记二:GC 垃圾回收

概述学过一点java的都知道,java的GC是有JVM自动执行的。java内存运行时区域的各个部分,其中程序计数器、栈(虚拟机栈、本地方法栈)这些区域随着线程而生随线程灭而亡,这些区域内存分配和回收都...

垃圾回收算法简介——JVM读书笔记<二>

垃圾回收的过程主要包括两部分:找出已死去的对象、移除已死去的对象。 确定哪些对象存活有两种方式:引用计数算法、可达性分析算法。 方案一:引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用...

二、Java中的垃圾回收

在垃圾回收中,标记清除(Mark and Sweep)是最重要的一个思想。但是想要在实际场景中应用这一思想,还是需要进行一些调整的。本文接下来就通过简单的示例来分析JVM是如何保证安全持续的分配对象的...

垃圾回收和内存分配策略(二)

垃圾收集算法:A:标记-清除算法:分为标记和清除两个阶段。标记要回收的对象,然后进行清除。 有两个问题1:效率不高 2:会产生大量不连续的内存碎片。 碎片太多,假如程序运行时,需要分配较大对象时,...

深入理解java虚拟机笔记(二)-垃圾回收

ps:文中的图片都来自网络。部分图片来源1. 前言作为一种高级语言,比起c和c++来,很进步的一点就是垃圾回收机制。这省去来了我们很多的工作,不过,我们仍然需要了解垃圾回收,这对我们的成长很有帮助。2...

JVM调优总结系列之二:基本垃圾回收算法

可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个...

JVM调优总结(二)--垃圾回收

基本垃圾回收算法 可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法。原理是此对象有一个引用,即...

深入理解JVM之二:内存的垃圾回收算法

在接收垃圾回收算法是有必要对以下知识点了解熟知: 哪些内存需要回收: jvm虚拟机内存结构中程序计数器、本地方法栈、虚拟机方法栈都是线程私有的,随着线程的创建被创建,随着线程的销毁而推出,栈帧随着...
  • zjngogo
  • zjngogo
  • 2016年04月04日 22:08
  • 639

成为Java GC专家系列(二)——监控Java垃圾回收

本文是成为Java GC专家系列文章的第二篇。在第一篇《成为Java GC专家系列(1)——Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解...

Java内存管理(二、Java垃圾回收)

二、Java垃圾回收 1. JVM运行环境中垃圾对象的定义     一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收。或 当对象在JVM运行空间中无...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:垃圾回收二
举报原因:
原因补充:

(最多只允许输入30个字)