1.定时器 
        采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充 
2.channel的生成周期

(0)、初始(诞生) 
        发布、订阅均有可能产生channel

  • 发布:向channel以post的形式发布消息时,如果不存在channel则产生
  • 订阅:模块配置允许订阅产生channel的情况下,如果向一个不存在的channel上订阅时则产生

channel自诞生之日期就是在无奈的等死。。。只要channel被使用一次(发布、订阅)则其寿命被延长一次,保持状态处于“初始” 
(1)、死缓 
        模块每隔一段时间(默认为11s)会进行内存回收——ngx_http_push_stream_collect_expired_messages_and_empty_channels。如果一个channel既没有存储信息也没有订阅者,那它就是废物了,标记为deleted,设定过期时间为当前时间+一段时间(默认为30s),并将该channel移动到垃圾回收站。。。等死吧,不过别慌,你还有活的可能 
(2)保外就医 
        如果有人关心你(订阅、发布、统计channel信息)则将处于死缓状态的channel从垃圾堆中还原 
(3)、死刑 
        除了死缓,还有种机制可以直接将channel判为死刑——以DELETE的方式请求发布通道,则无视该channel的任何亲属关系(存储的信息、订阅者)则直接将其标记为deleted,扔入unrecoverable_channels队列。。。别幻想了,系统会ngx_http_push_stream_alert_worker_delete_channel,通知为该通道工作的ngx worker诛九族(清理该channel的订阅者、存储信息等系统资源) 
(4)处决 
        执行周期性内存清理时,除了ngx_http_push_stream_collect_expired_messages_and_empty_channels外,还会执行ngx_http_push_stream_free_memory_of_expired_messages_and_channels将过期的channel彻底删除;未过期的channel仍处于死缓状态

3.MSG的生成周期

(0)、初始(诞生) 
        发布消息时产生,同时预设其死亡时间(如果配置中设定msg_ttl则预设生命期为此值,否则 
(2)、死刑生存期为0——生成即死亡);设定一个buffer清理定时器(默认为1s)来清理msg。 
(1)、死缓 
        诞生时即等死,在清理buffer时(默认设置为msg诞生1s后)将该消息标记为deleted,扔入messages_to_delete.queue;新队列超长则执行FIFO,最老的MSG判为死刑(标记为deleted,扔入messages_to_delete.queue)。 
(3)(4)执行 
        对于死缓信息,在下一次垃圾清理(ngx_http_push_stream_free_memory_of_expired_messages_and_channels)时将该过期msg彻底删除。对于死刑信息,在buffer清理定时器到期时将其清除

ngx-push-stream模块源码学习(五)——内存清理的更多相关文章

  1. ngx-push-stream模块源码学习(四)——订阅

    一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...

  2. nginx-push-stream模块源码学习(三)——发布

    一.概述     发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG     发布 ...

  3. nginx-push-stream模块源码学习(二)——模块初始化

    本文重点介绍push stream模块的构成,至于nginx如何启动.维护该模块不会详细阐述,以后有时间会做详细阐述. 一.模块定义 1.1.  模块配置 通用nginx模块的配置struct有三种, ...

  4. spring源码学习五 - xml格式配置,如何解析

    spring在注入bean的时候,可以通过bean.xml来配置,在xml文件中配置bean的属性,然后spring在refresh的时候,会去解析xml配置文件,这篇笔记,主要来记录.xml配置文件 ...

  5. [spring源码学习]五-BeanPostProcessor的使用

    一.接口描述 spring提供了一个接口类-BeanPostProcessor,我们叫他:bean的加工器,应该是在bean的实例化过程中对bean做一些包装处理,里边提供两个方法 public in ...

  6. Python 源码学习之内存管理 -- (转)

    Python 的内存管理架构(Objects/obmalloc.c): _____ ______ ______ ________ [ int ] [ dict ] [ list ] ... [ str ...

  7. ngx-push-stream模块源码学习(一)——序言

    一.概述     与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据.     主流的comet技 ...

  8. co模块源码学习笔记

    // Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...

  9. 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)

    一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范.  1.AMD(Asy ...

随机推荐

  1. MPEG-DASH on IIS Practice in Action

    1. 准备  IIS Media Service已经安装准备好(如上),注意需要在2008上安装,2003安装不了,或者就算能安装也很麻烦 一个或多个码率的媒体文件如MP4已经准备好 DASH MPD ...

  2. MVC+Bootstrap设计

    MVC+Bootstrap) 二 框架设计 文章目录: 一.前言 二.结构图 三.项目搭建 四.代码生成 五.实现接口 六.依赖倒置 七.登录实现 八.最后 一.前言 这个框架是从最近几年做过的项目中 ...

  3. 安装uBuntu操作系统 - 初学者系列 - 学习者系列文章

    uBuntu是一款不错的Linux操作系统,在上面的应用软件不少,就是说它的支持率挺高.下面就对这款操作系统的安装做下介绍. 1.  下载uBuntu安装文件 打开中文页面.http://www.ub ...

  4. Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中

    功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML> <HEAD> <title>We ...

  5. Linux Shell脚本入门--Uniq命令

    uniq uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用.也就是说,为了使uniq起作用,所有的重复行必须是相邻的. uniq语法 [root@www ~]# uniq [ ...

  6. Oracle wrap 和 unwrap( 加密与解密) 说明

    一. Wrap 说明 官网的说明如下: A PL/SQL Source Text Wrapping http://download.oracle.com/docs/cd/E11882_01/appde ...

  7. C#程序员阅读的书籍

    推荐几本C#程序员阅读的书籍   楼主这些年一直追随微软技术,也看了不少书籍,整理出一些个人认为不错的经典,推荐给各位阅读,以共同进步. 推荐顺序是由浅入深,深入浅出. <Professiona ...

  8. RESTful API Develop

    yii2 RESTful API Develop   参考文档:http://www.yiiframework.com/doc-2.0/guide-rest.html 以 DB 中的 news 表为例 ...

  9. waitFor和waitForAny的实现

    waitFor和waitForAny的实现 在实现waitFor方法之前,我们先要搞明白下面这些问题: 1. waitFor方法的形参有限制吗? 没有!如果形参是Task类型,不应该启动Task,如果 ...

  10. dbcp的配置

    tomcat的 配置,进入conf->context.xml <Resource name="mysql"     auth="Container" ...