用链表实现nodejs的内存对象管理

时间:2022-03-15 12:51:25

虽然javascript拥有垃圾收集,但是垃圾收集机制并不会自动释放持久对象,比如websocks连接。

为了能够在某些特定情况下中止一些连接(比如内存不足),显然要建立全局的对象管理器进行管理。

显而易见,双向链表是最符合管理这类对象的数据结构。

这里实现了增加对象,删除某个对象,以及释放所有对象的方法。

var manager=module.exports=function(){
this.head={"next":null};
this.last=this.head;
}
manager.prototype.add=function(obj){//添加节点
var prev=this.last;
var newlast={"prev":prev,"next":null,"obj":obj};
prev.next=newlast;
this.last=newlast;
return newlast;//对象移除时使用的句柄
}
manager.prototype.remove=function(node){//被对象的中止过程调用移除节点
var prev=node.prev;
var next=node.next;
prev.next=next;
if (next!=null) {next.prev=prev;}
node.prev=null;
node.obj=null;
node.next=null;
}
manager.prototype.free=function(){//全部释放,如果加一个计数器可以实现释放指定数量的节点,您可以试试
var cur;
while((cur=this.head.next)!=null){
cur.obj.end();//执行对象的中止过程
}
}
//链表实现添加,移除,清空

用链表实现nodejs的内存对象管理的更多相关文章

  1. Java内存管理及对Java对象管理

    Java内存管理及对Java对象管理 1Java内存管理 1.1Java中的堆和栈 通常来说,人们会将Java内存氛围栈内存(Stack)和堆内存(Heap). 栈内存用来保存基本类型的变量和对象的引 ...

  2. C语言中内存的管理

    一.动态内存分配与释放 1.为什么要使用动态内存分配,以下看一个实例,关于超市中购买记录的一段程序 #include <stdio.h> #include <string.h> ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 &lpar;24&rpar; ------ 第五章 加载实体和导航属性之查询内存对象

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-4  查询内存对象 问题 你想使用模型中的实体对象,如果他们已经加载到上下文中, ...

  4. 《zw版&&num;183&semi;Halcon-delphi系列原创教程》 Halcon分类函数010&comma;obj,对象管理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数010,obj,对象管理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

  5. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

  6. 高性能的分布式内存对象缓存系统Memcached

    Memcached概述   什么是Memcached? 先看看下面几个概念: Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所缓存的内容非持久化.对于CPU要求很低,所以常常采 ...

  7. 分布式内存对象缓存系统Memcached-概述

    全面掌握Memcached 1.       概述 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,是为了加快网站http://www. ...

  8. &lbrack;Effective C&plus;&plus; --013&rsqb;以对象管理资源

    这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...

  9. 《Effective C&plus;&plus;》学习笔记条款13 以对象管理资源

    条款 13 :以对象管理资源 例:      voidf()      {           Investment *pInv = createInvestment();           ... ...

随机推荐

  1. Python进程、线程

    Lock & RLock :用来确保多线程多共享资源的访问. Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池. Event : 是最简单的线程间通信的方式,一个线程可以 ...

  2. Linux功能-环境变量

    linux系统中有很多重要的环境变量,我们可以用env命令查看它们. 变量是由固定的“变量名”与用户或系统设置的“变量值”两部分组成,也可以自行修改. [root@localhost ~]# env ...

  3. cics下任务的停止

    cicsterm CEMT I TA TAB==找到要停止的进程 在进程后加入 f或者p 或者fp =========================== 或者找到进程ID号 用命令:kill -9 ...

  4. SE 2014年4月4日

    如图OSPF自治系统中有4个区域,要求如图配置使得中所有网络均能够相互访问为了网络安全及优化网络性能: 使用ospf实现全网互通: [RT1]ospf 1 router-id 1.1.1.1 [RT1 ...

  5. mfc--使用ShellExecute打开另一个可执行程序

    ShellExecute(sFile [, vArguments] [, vDirectory] [, vOperation] [, vShow]) ShellExecute(NULL,"o ...

  6. 51NOD 1258&&num;160&semi;序列求和&&num;160&semi;V4 &lbrack;任意模数fft 多项式求逆元 伯努利数&rsqb;

    1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...

  7. CSV的简单用法

    读文件 import csv with open('test.csv','rb') as myFile: lines=csv.reader(myFile) for line in lines: pri ...

  8. 时间格式yyyyMMddHHmmss的大小写&comma;和字母含义

    字母     日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996 ; 96 M 年中的月份 Month July ; Jul ; 07 w 年中的周数 Numb ...

  9. Java反编译工具Luyten介绍

    比较精准的一个java反编译工具,笔者有时候用jd-gui反编译不出来的class用luyten都可以反编译出来. 官方网站:https://github.com/deathmarine/Luyten ...

  10. 压缩JS时生成source&lowbar;map

    @echo off :: 当前目录 src/test set currDir=src/test/ set sourceMapFileName=test.js.map set inputList=%in ...