erlang二进制数据垃圾回收机制
erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内。假设超过了64 bytes。就被保存到进程外的共享堆里,能够给节点内全部进程共享。
erlang有两种二进制容器:heap binaries和refc binaries。
heap binaries
Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They will be copied when the process is garbage collected and when they are sent as a message. They don't require any
special handling by the garbage collector.
这个就是进程堆二进制,是一些比較小的二进制数据。每一个数据大小不超过64bytes,这些数据保存在进程堆内。对于这里的二进制数据,垃圾回收走的是进程堆数据的回收机制,參考这里。假设发给其它进程的消息含有这些数据,erlang将直接复制一份到别的进程堆内。
针对heap binaries。在R13B03后,erlang还添加了bin vheap来加快二进制数据的回收。
OTP-8202 A new garbage collecting strategy for binaries which is more aggressive than the previous implementation. Binaries now has a virtual binary heap tied to each process. When binaries are created or received
to a process it will check if the heap limit has been reached and if a reclaim should be done. This imitates the behavior of ordinary Erlang terms. The virtual heaps are grown and shrunk like ordinary heaps. This will lessen the memory footprint of binaries
in a system.
就是说heap binaries的垃圾回收使用了进程堆数据的回收方式。但使用了一个虚拟二进制堆(vheap)来计算这些二进制的使用情况,加快内存回收速度。
refc binaries
Refc binaries consist of two parts: an object stored on the process heap, called a ProcBin, and the binary object itself stored outside all process heaps.The binary object can be referenced by any number of ProcBins
from any number of processes; the object contains a reference counter to keep track of the number of references, so that it can be removed when the last reference disappears.
官方的叫法是引用计数二进制,就是对于那些超过64bytes的二进制数据,他们假设直接保存在进程堆内。将导致进程频繁的gc。比較大的数据复制来复制去开销也非常大。
所以。erlang将这些数据保存在进程外的共享堆,再把这个二进制数据的地址给拥有这个数据的进程。
所以,进程堆内保存的是这个二进制数据的引用,叫ProcBin。假设进程把这个二进制数据发给其它进程,erlang也不再复制整个二进制数据,而是直接再生成一份ProcBin到别的进程堆内。那么,这个二进制数据就能够多个进程的ProcBin引用,当没有一个ProcBin引用到这个二进制数据。这个二进制就被erlang回收。
所以,这样的二进制数据的gc的是引用计数的回收机制。注意了,ProcBin是进程堆内数据。走的是进程堆数据的回收方式。
什么是引用计数垃圾回收机制
引用计数就是每一个数据对象都配有一个计数器,计算对象被引用的次数。
多了一个引用就加1。少一个引用就减1,当引用次数为0时就回收数据。
这样的垃圾回收机制实现简单,回收及时,但也有副作用。就是easy造成循环引用,就是A引用B,B引用C,C引用了A,导致A、B、C都无法被回收。
那么。erlang会不会也有循环引用的问题?这里就不用操心,erlang的变量是单向赋值。仅仅存在ProcBin对二进制对象的单向引用
最后。说下erlang另外两种二进制数据:sub binary和match context
A sub binary is created by split_binary/2 and when a binary is matched out in a binary pattern. A sub binary is a reference into a part of another binary (refc or heap binary, never into a another sub binary). Therefore, matching out a binary
is relatively cheap because the actual binary data is never copied.
A match context is similar to a sub binary, but is optimized for binary matching; for instance, it contains a direct pointer to the binary data. For each field that is matched out of a binary, the position in the match context will be incremented.
前面谈到erlang为避免二进制数据复制带来的时间和空间的开销,erlang这里做得更彻底一点,sub binary和match context事实上是引用对象,被用来引用heap binary和refc binary的数据
说到sub binary和match context,这两者有什么差别?
sub binary是一个子二进制数据,从一个二进制切割出来,或匹配一个二进制后产生,具有二进制数据通用的属性和方法;match context是匹配上下文,在erlang进行二进制数据匹配时产生。假设接下来使用了匹配到的二进制数据。那么erlang就将这个match context数据转成sub binary。就是说。match context数据不直接被用户使用。仅仅是erlang用以二进制匹配优化的过程数据
erlang二进制gc的副作用
从上面的内容能够知道。erlang二进制gc有两种gc。heap binary的是进程堆的分代gc,refc binary的是分代gc+引用计数。所以在上文讲到的erlang垃圾回收的副作用,这里相同会有。并且。erlang二进制还增加了引用对象的概念,一个二进制数据能够有多个引用。能够被多个进程引用,也就是要多个进程堆的分代gc后才干回收,这就使得二进制gc更难控制,回收不及时。
另外,在实际的网络开发中,我们须要的数据可能仅仅是二进制数据的一小部分,从上面的内容也能够了解到,假设我们还在使用二进制数据的一部分,那这个二进制数据是不会參与gc的。针对这个问题我们该怎样解决?
%% 生成一个100字节的二进制A
1> A = binary:copy(<<1>>,100).
<<1,1,1,1,1 ...
2> byte_size(A).
100
3> binary:referenced_byte_size(A).
100 %% 匹配二进制,产生子二进制B
4> <<_:10/binary,B:10/binary,_/binary>> = A.
<<1,1,1,1,1 ...
5> byte_size(B).
10
6> binary:referenced_byte_size(B).
100 %% 复制二进制生成二进制C
7> C = binary:copy(B).
<<1,1,1,1,1,1,1,1,1,1>>
8> binary:referenced_byte_size(C).
10
上面。二进制B是二进制A的子二进制。假设B还有使用,A就不会參与gc;而二进制C是一个新的二进制,不会引用二进制A,让A能够參与垃圾回收
更新说明:
2014/06/13 补充了 erlang二进制垃圾回收的副作用
參考:
http://blog.csdn.net/mycwq/article/details/26741387
http://www.erlang.org/doc/efficiency_guide/binaryhandling.html#id65798
erlang二进制数据垃圾回收机制的更多相关文章
- Erlang进程堆垃圾回收机制
原文:Erlang进程堆垃圾回收机制 作者:http://blog.csdn.net/mycwq 每一个Erlang进程创建之后都会有自己的PCB,栈,私有堆.erlang不知道他创建的进程会用到哪种 ...
- Erlang垃圾回收机制的二三事
声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...
- 深入了解Erlang 垃圾回收机制以及其重要性(转)
声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...
- 大数据基础篇----jvm的知识点归纳-5个区和垃圾回收机制
一直对jvm看了又忘,忘了又看的.今天做一个笔记整理存放在这里. 我们先看一下JVM的内存模型图: 上面有5个区,这5个区干嘛用的呢? 我们想象一个场景: 我们有一个class文件,里面有很多的类的定 ...
- JVM运行时数据区和垃圾回收机制
最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...
- 理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆.堆是运行时 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- 编程语言类别;运行Python程序的方式;变量和常量;Python程序的垃圾回收机制;
目录 编程语言分类 运行Python程序的两种方式 1.交互式 变量与常量 1.变量 2.常量 3.小整数池 垃圾回收机制 编程语言分类 编程语言分为: 1.机器语言:直接用二进制的0和1和计算机(C ...
- 编程语言分类,Python代码执行,应用程序使用文件的三步骤,变量,常量,垃圾回收机制
编程语言分为 机器语言(直接用二进制01跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...
随机推荐
- Objective-C设计模式——桥接Bridge(接口适配)
桥接模式 桥接模式就是让抽象和实现分离的最好体现,符合面向对象的依赖倒转原则.Abstruct抽象类负责设计客户端接口,Implementor则负责具体的细节逻辑. 在桥接模式中,Abstruct类持 ...
- 重新学习Java——Java基本的程序设计结构(一)
最近在实验室看到各位学长忙于找工作的面试与笔试,深感自己的不足,决定重新好好学习一下<Java核心技术>这本书,曾经靠这本书走入Java的世界,但是也有很多的地方被我疏漏过去了,因此也是作 ...
- iOS浏览器不能打开手机QQ客服与指定用户聊天界面
这个问题是我在公司需求的时候遇到的,QQ推广工具网站获取的链接在苹果自带浏览器没法打开到聊天界面,是因为safair在打开到app store的时候把参数给丢了,app store再打开到QQ的时候就 ...
- web测试--登录界面怎么测?
具体需求: 有一个登陆页面, 上面有2个textbox, 一个提交按钮. 请针对这个页面设计30个以上的测试用例. 此题的考察目的: 面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了 ...
- java树型结构的数据展现设计
在做一个需求管理的页面时,需求的展现是不限层级树型结构,需求下还可以分拆任务,页面要展现的字段有20多个,而且需求采用通用表单设计,db采用大宽表存储,有一百多个字段.目前数据量不大,第一版采用普通的 ...
- SQL SERVER 执行计划各字段注释
SET SHOWPLAN_ALL使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句.相反,SQL Server 返回有关语句执行方式和语句预计所需资源的详细信息. ...
- 梦想CAD控件关于曲线问题
IMxDrawCurve 接口 控件中的曲线接口,实现了曲线的相关操作,如求曲线的长度,最近点,面积,曲线上任一点在曲线上的长度 切向方向,曲线交点,坐标变换,打断,偏移,离散等功能. 一.返回曲线组 ...
- Day 14B 网络应用开发
网络应用开发 发送电子邮件 在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知.网站向用户发送一个激活账号的链接.银行向客户推广它们的理财产品等几乎都 ...
- iview“官方“实现的右键菜单
博客开篇,没想到第一篇博文竟然是前端的,虽略显尴尬,但正能量溢出,你我可能遇到同样问题,在这里分享下个人方案,希望对你有用. 官方目前不提供右键菜单,这里借助Dropdown(下拉菜单)来实现,故为“ ...
- Jmeter使用笔记之断言
前言 Jmeter的断言方式有很多种,由于在工作中经常做的是API接口测试,所以这篇文章主要介绍如何对接口的字段进行解析,如何对解析出来的字段的值断言 了解API接口 Restful API 规范 协 ...