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. json 解析解乱码

    1. 该法的字符编码: 串店txt文档文档都有自己的编码,例如utf-8,ansi等待,但当 存款txt文件.其编码将和txt编码文件本身一致.  例如,之前的字符编码ansi.txt该文件的编码是u ...

  2. finally 对 return 值没有影响

    public int gettest(ref int i, ref int k) { int j = 0; try { return i / j; } catch (Exception Ex) { k ...

  3. iOS开发的一些奇巧淫技2

    能不能只用一个pan手势来代替UISwipegesture的各个方向? - (void)pan:(UIPanGestureRecognizer *)sender { typedef NS_ENUM(N ...

  4. 多线程编程 (1) -NSThread

    每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那 ...

  5. iOS7 UIKit动力学-碰撞特性UICollisionBehavior 上

    我们谈到了重力上述财产UIGravityBehavior这个类. 非常明确的看法,当我们添加的属性的严重性后,,苹果UIview像掉进无底洞,地下坠,不断的加速.而如今呢,我们要在这个手机屏幕上,加入 ...

  6. Math.random引发的骗术,绝对是用随机数骗前端妹纸的最佳方法

    我觉得今天我运气特好,今天我们来赌一赌,我们来搞个随机数,Math.floor(Math.random() * 10),如果这个数等于0到7,这个月的饭,我全请了,如果是8或9,你就请一个礼拜成不?于 ...

  7. testNg的安装与卸载

    1.testNG的安装 打开eclips,点击Help菜单.选择Install New Software. 在弹出的窗口的work with的输入框,输入http://beust.com/eclips ...

  8. 一个可以直接使用的MsgBox基于form居中API

    可直接复制DialogBox项目(文件夹)到需要的项目中然后直接引用和using CodeProject.Dialog 已修正原作者代码错误的地方,可直接使用,VS2010测试成功 具体可以参考案例T ...

  9. 使用AutoTools自动生成Makefile

    前两天赶时间写了个简易的数据库系统,实现了简单的增删改查等功能.因为赶实验...无节操的我用shell实现的文件读写...咳咳...这都不是重点,重点是自己写Makefile感觉有点不伦不类...虽然 ...

  10. 在OpenWrt上编写自己的硬件操作程序

    上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...