修复miniblink 文件编码检测和退出内存泄漏的bug

原创 2016年05月31日 15:57:55

文本检测的bug原因是我把icu整个都端了,自然icu里检测编码的好用接口也废弃了。不过我扣了一部分出来,用于检测UTF8和GBK编码。剩下的编码,经海绵宝宝

的提醒,用了微软的

IMultiLanguage2::DetectInputCodepage

接口,发现还挺好用的,感谢海绵宝宝。

接口用法:http://www.codeproject.com/KB/recipes/DetectEncoding.aspx?display=Print

需要注意的是,这个IMultiLanguage2::DetectInputCodepage接口返回S_FALSE的话,其实也是成功的,但msdn里显然写错了。害的我调试了一天,一直以为哪个地方没写对,汗···


内存泄漏的问题,花了比较久。这里需要隆重推荐下blink里的olipan项目,这货居然实现了C++的自动垃圾回收!而且是可以检测循环引用的。据说V8也把这货集成进去了。

有时间我要把这个组件从blink里扣出来,目前来看依赖不大,但是需要实现一些thread相关的接口。

看这段介绍:

在Oilpan项目之前,Blink和Chromium都采用引用计数技术(referencecounting)来管理内存,每个对象内部都一个引用计数,表明当前对象被引用了多少次,当引用技术归零时,对象就会被自动释放掉,这种方式一直以来都存在一个缺陷就是循环引用问题,就A引用了,B又引用了A,最后导致A和B都没有机会释放,此外,C++中启用引用计数还存在其他几个方面的问题:

  • 引用计数器的增减开销问题;
  • C++中可以通过Raw指针轻易地绕开RefPtr的管理,一旦使用不当,将导致use-after-free内存错误,存在安全问题;

尽管引用计数存在上述一些问题,但它很轻量级,仍然是C++程序中广泛使用的自动内存管理计数。Blink项目并不满足这种轻量级的内存管理方法,于是Oilpan项目提上日程,要实现对Blink对象的自动回收机制。比起引用计数技术,Oilpan垃圾回收器确实是个庞然大物,它实现了一个一般只有虚拟机才需要的高级特性,然而Blink项目力求精益求精,追求最好!

Oilpan实现了一种跟踪式的垃圾回收机制,具有如下特点:

  • Blink中所有的对象都将分配在一个受托管的堆中,每个对象都提供了一个trace的方法,用来建立与堆中其他对象的可达关系,因此,从根节点(一般DOMWindow)出发,Blink的对象在托管堆中形成了一个对象图,那些由根节点不可达的对象将会被GC掉,这样就避免了循环引用问题。
  • Oilpan的GC并不会随时都发生,它会被推迟到消息循环中执行,因为当消息循环执行完任务队列中最后一个任务时,此时Blink的栈为空,没有在栈中分配的对象了。
  • 一旦需要执行GC时,Blink首先要确保所有运行的线程到达了一个“安全点”,不会再分配新的对象,然后从根节点出发,计算堆中所有对象的传递可达性,并标记(mark)所有可达的对象,最后每个线程开始清理(sweep)属于自己的那部分堆空间,回收所有未被标记的对象,将其插入到空间列表中。
  • 与V8引擎的GC相比,Oilpan的GC会牵扯到Blink所有的线程,Database线程,File线程等等,所有的线程都共享一个Oilpan的堆空间。
  • Oilpan提供了两个超类GarbageCollected和GarbageCollectedFinalized,来保证它们的子类都分配在由Oilpan管理的堆中。

截止到目前,Oilpan基础框架已经比较稳定,modules/中所有对象默认都启用了Oilpan,但Node层次结构还未正式启用。


另外还有:http://chinagdg.org/2016/01/smarter-garbage-collection-for-smoother/


感觉简直屌炸天。


回到正题,目前只需要调用blink::shutdown 即可。但我实验下发现还需要手段调用v8::Isolate::GetCurrent()->LowMemoryNotification();才能把v8的内存给回收了,

否则一些dom node一直被v8给占着。这点需要记录一下。可能是我哪个地方调用不对吧。以后再关注。

wke + delphi + Miniblink delphi 开发 webui最佳组合

  • 2017年12月25日 16:59
  • 18.85MB
  • 下载

miniblink 16.11.2更新

1,支持npapi,可以播放flash了 这个花了极大的精力。因为原版chromium早已不支持npapi接口了。而且原版老的版本还是多进程架构的,移植过来很麻烦。 所以我直接用了webkit的部...
  • weolar
  • weolar
  • 2016年11月04日 08:45
  • 1529

搞了个miniblink的github站点

见https://weolar.github.io/miniblink/
  • weolar
  • weolar
  • 2016年07月19日 14:31
  • 1084

miniblink 16.10.17更新

miniblink 16.10.17更新了: 1.支持剪切板 2.网络层切换到curl。不再使用wininet。原因是wininet问题太多,尤其是各种老版本xp。 3.修复一些小crash。...
  • weolar
  • weolar
  • 2016年10月17日 09:38
  • 827

miniblink支持Web Components的Document.registerElement了

其实就是把之前干掉的dom/custom目录下的东西加了回来。又增大了点大小了
  • weolar
  • weolar
  • 2016年06月09日 20:25
  • 972

大家久等了,miniblink终于开源了!!

国内网速比较慢,传了一天终于传好了。 本次开源的代码未经许可,禁止用于商业用途!...
  • weolar
  • weolar
  • 2016年09月27日 22:05
  • 6650

浏览器嵌入组件miniblink使用笔记

miniblink是龙泉寺扫地僧基于chromium内核开发的一款开源浏览器嵌入组件,相对于BlzFans早期开发的WKE组件,在HTML5支持、JS引擎速度、新Web标准兼容性上都有较大改进,而且项...
  • tomggx
  • tomggx
  • 2017年09月15日 21:07
  • 750

郁闷了,miniblink的electron接口必须使用多进程模式了

最近miniblink的electron模式开发本来一切顺利,但昨天遇到一个大坑。 electron里主进程和渲染进程是分开的,在miniblink的electron模式里是使用多线程模拟的,每个线...
  • weolar
  • weolar
  • 2017年04月16日 20:53
  • 1121

miniblink滚轮太慢bug修复

原因是没设置webWheelEvent.hasPreciseScrollingDeltas = true;。 说起来简单,实际上找到这个原因花了一晚上。通过各种log打印,发现从发送m_webVie...
  • weolar
  • weolar
  • 2016年05月14日 22:38
  • 956

miniblink修复3D变换的两处渲染Bug

情况是这样的,有个群友让我试了下http://2.swiper.com.cn/demo/3dflow/index.html  里面的3D flow效果,发现miniblink画出来是个平的,没有3D效...
  • weolar
  • weolar
  • 2016年06月06日 21:21
  • 864
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修复miniblink 文件编码检测和退出内存泄漏的bug
举报原因:
原因补充:

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