Javascript多线程引擎(九)
Javascript多线程引擎(九)--垃圾回收
垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep 算法 最后进化到 分代回收, 可以发现程序员越来越懒了^_^.
从繁琐的内存管理解放出来 对业务逻辑开发为主的程序员来说是非常有必要的事情, So Java 等高级语言变成了现今的主流语言(当然也和它的跨平台和异常强大的类库相关).
作为Javascript引擎, 当然也不能少了垃圾回收的功能, Google V8 , TraceMonkey 等都带有一个非常牛掰的垃圾回收机制外加JIT功能, 使得它们摇身一边就成了服务器引擎.
而这个项目的垃圾回收在前期决定不添加该功能, 到后期发现少了垃圾回收对内存的消耗太过于厉害(原先估算1MB的内存能干很久了, 结果发现短短几分钟就被吃掉了), 所以在写前一篇文章的时候, 进入了深入的思考, 如何把垃圾回收添加到该引擎上.
开发过程中遇到的问题有很多(主要的问题是关系图完整性的确定):
1. 如何最小化的侵入原有代码中(使用mark-sweep)
2. 如何同步 EVAl线程和 Async线程(EVAL 线程为运行Js代码的线程, Async线程相当于AJAX的线程, 这个线程的内存控制不受VM管理, 在结束Async线程的时候需要把必要的数据同步到VM 的GC管理器中),
3. 如何选择一个时机来进行垃圾回收, 对于多线程同时进行申请内存如何进行快速的分配而不因为加锁而导致效率下降(记录新的内存申请需要把该内存申请记录到GC中)
4. 如何快速的插入新申请内存的记录到GC管理中(以内存地址为hashcode插入到Hashtable中实现了O(1)的时间),....
为了解决这些问题, 翻阅了lua代码,jamvm(Java 的解释器版本不带有JIT等该机特性). 归纳了如下的解决方案:
1. 每条线程都附带一个HashTable进行管理该线程进行GC Malloc的内存记录, 在线程结束的时候, 把TLS中关于GC的内存记录 Commit 到主存
2. 垃圾回收的地点发生在主存, 对于TLS中的申请记录即使没有被Mark到也不进行回收(这是为了线程运行中的那些临时数据), 这也保证了Async线程Malloc的内存不会被回收.
3. 只有当VM所有Engine都处于IDLE状态的时候才进行垃圾回收, 这保证了EVAL中的临时数据不会被破坏.
4. 为了保证关系图的完整性 , 如一次链表的插入, A->B 的关系中, 需要变成 A->C->B的关系, 期间有可能临时变化为 A C->B 这种引用关系, 而如果期间再发生GC的话, 就发生灾难性后果, B以及链接在B的子对象被回收, 所以选择了在线程结束(这个时候不可能有不完整的关系图 )或者一次手动Commit()内存到主存的API给程序员控制(调用该API需要确保关系图的完整性).
如下是GC的测试结果:

每次运行fun函数, 会申请 1000* 100 = 10W 个对象
然后由调用setTimeout() 等待10s的时间, 来使得Engine都处于IDLE状态, GC线程进行工作.

(以上单位是字节)
运行完毕后, 10w个对象相当于使用了 17MB的内存, GC 过后, 只有11KB的内存被占用这, 这部分内存其中有10KB左右被预置对象[Global, Thread, Object, Function ... ]和VM必要数据占用, 而剩余的1KB则是运行文件后, 产生fun函数对象记录到Global中就不会被释放掉了。
所以垃圾回收模块可以算是完成了, 性能也不错, 开启虚拟机 到申请10w个对象,完成17MB内存的回收只用了 5秒左右, GC的时间差不多为0.5s 左右, 不过这个性能和JVM相比还是不好的, JVM可以在Engine不打断执行的情况下完成垃圾回收, 具体的做法就是把完整性确定的时间进行细分, 使得可以在运行Java代码的时候回收内存.
现在这个项目可以算是比较完整了^_^ , 就是缺少了一些应用比如说 web服务等, 这些等下一个版本再做。
接下来就是万恶的毕业季了, 找工作Style。。。。
项目地址:
github.com/darkgem/js-engine
谢谢大家的支持~
Javascript多线程引擎(九)的更多相关文章
- Javascript多线程引擎(十)---Web服务器
Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...
- Javascript多线程引擎(八)
Javascript多线程引擎(八) Javascript 多线程项目, 做到现在已经快3个月了(加上前期准备编译原理和必要的文档), 该项目(js-engine)已经快进入尾声了, 现在该引擎 ...
- Javascript多线程引擎(七)
Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...
- Javascript多线程引擎(六)
Javascript多线程引擎(六) 经过三个月的时间, Javascript 引擎已经完成beta版本(还不支持多线程特性, 预计下个星期就可以支持了, 现阶段还在进行测试基本JS单元功能), 并且 ...
- Javascript多线程引擎(五)
Javascript多线程引擎(五)之异常处理 C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果 ...
- Javascript多线程引擎(四)
Javascript多线程引擎(四)--之C语言单继承 因为使用C语言做为开发语言, 而C语言在类的支持方面几乎为零, 而Javascript语言的Object类型是一个非常明显的类支持对象,所以这里 ...
- Javascript多线程引擎(三)
Javascript多线程引擎(三) 完成对ECMAScript-262 3rd规范的阅读后, 列出了如下的限制条件 1. 去除正则表达式( 语法识别先不编写) 2. 去除对Function Decl ...
- Javascript多线程引擎(一)
Javascript多线程引擎(一) Javascript 天生是单线程的语言, 不支持synchronized等线程操作, 但是这便不妨碍Javascript作为web语言中最具有魅力语言之一. 虽 ...
- Javascript多线程引擎(二)
多线程Javascript解释器的大致架构 由于一个完整的解释器类似Google V8的解释器需要的工作量非常的大如需要实现如下的模块: 词法分析,语法分析器,AST转Byte模块,解释执行模块和JI ...
随机推荐
- IOS计划 分析
1.基本介绍 IOS苹果公司iPhone.iPod touch和iPad操作系统和其他设备的发展. 2.知识点 1.IOS系统 iPhone OS(现在所谓的iOS)这是iPhone, iPod to ...
- HDU 4946 Area of Mushroom 凸包 第八次多校
题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...
- java_前端_autocomplete_搜索框自动匹配提示
效果图: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> < ...
- Hadoop上传文件的报错
baidu了很多,都说防火墙,datanode没有正常启动的问题,可是检查了都是正常,后来还是在老外的网站上找到了解决的方法 修改了/etc/security/limits.conf文件,上传成功 这 ...
- SQL 把表中字段存储的逗号隔开内容转换成列表形式
原文:[原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式 我们日常开发中,不管是表设计问题抑或是其他什么原因,或多或少都会遇到一张表中有一个字段存储的内容是用逗号隔开的列表. 具体效果如下图: ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- MyEclipse优化全攻略
(0) 吐槽 Eclipse仅仅是个半成品有木有?什么都须要自己安装插件,新手非常难用有木有? 安装上插件以后了版本号兼容和各种问题烦死人有木有? 都怪碎片和版本号乱公布有木有? IntelliJ I ...
- leetcode先刷_Merge Two Sorted Lists
非常easy问题. 唯一的地方可以具有更具挑战是确保不会引入额外的空间.查找开始值最小的名单列表的新掌门人,头从列表中删除.其他操作应该没有问题. class Solution { public: L ...
- 我的MYSQL学习心得(十二)
原文:我的MYSQL学习心得(十二) 我的MYSQL学习心得(十二) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...
- C语言学习-数据结构 - 倒插法顺序表
// test20161106.cpp : Defines the entry point for the console application. // #include "stdafx. ...