erlang 架构原理_Erlang与Java内存架构

erlang 架构原理

我读了一篇关于Erlang VM的内存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰写的论文 ,我认为讨论Erlang的内存设置和Oracle的Java VM之间的差异可能会很好。

作为对从未听说过Erlang的人们的一个简短的介绍; 它是一种功能语言,使用异步消息传递作为并发的基础。 消息传递使用复制语义,从而可以在不止一台机器上运行的多个Erlang VM上进行分发,这实际上对程序员是透明的。

从某种意义上来说, Erlang和Java都是相似的,它们都使用虚拟机将硬件抽象为可移植层。 两种语言都使用与机器无关的字节码。 两种运行时系统都依赖垃圾回收来释放程序员进行内存管理的能力。

Erlang中的线程开销非常低。 我相信, Erlang中线程的内存要求约为512字节。 在Java中,线程通常需要大约512 KB,大约是1000倍。 对于程序员而言,结果是不必创建线程来异步执行某些工作,而不必坐下来思考。 典型的Erlang系统具有成千上万的线程。 像我们在Java中那样,线程池和执行器没有麻烦。

从我所涉猎的内容来看,我发现Erlang在功能性语言和允许您编写实际应用程序的语言之间达成了令人愉快的折衷。 (我知道我会为此感到迟疑)强大的分布式错误处理令人惊喜,编写任何类型的网络服务器实际上都很容易。 Web服务器的状态机方法使回滚错误变得完全自然。

但是这篇文章与Erlang的编程模型无关。 这是关于Erlang VM处理内存的方式。

当前的Java虚拟机使用Erlang程序员称为共享堆拓扑的东西。 所有线程都使用一个大堆。 大多数内存分配在该堆上。 除了堆之外,JVM还使用一些专用数据区域,例如代码缓存和永久生成。 这些也在所有线程之间共享。

相比之下, Erlang使用私有堆拓扑。 每个线程都有自己的微小堆,该堆包含该线程使用的所有数据以及该线程的堆栈。 线程的所有数据都在该本地堆上。 创建线程时保留它。 当线程死亡时,整个堆将简单地返回到空闲内存池。

除了专用堆之外,所有线程都共享对所谓的二进制堆和消息堆的访问。 这些是专门的堆。 二进制堆用于分配大块的任意数据,这些数据很可能在线程之间共享。 例如文件输入或网络缓冲区。

消息堆是消息中使用的数据的堆。 消息也在进程之间共享。 通过将指针从发送线程复制到接收线程,可以在线程之间传递消息。 消息的数据存储在消息堆上。

Erlang内存模型给我留下了深刻的印象。 它比Java的单堆模型具有更大的可扩展性。 语言语义和内存模型完美匹配。

例如; 堆是线程专有的简单事实使线程可以对自己的数据进行各种形式的锁检查。 再加上没有破坏性写入的事实,突然间也不需要对共享数据进行锁定检查。

最新版本的Erlang VM通过拥有多个调度程序,进一步迈出了又一步。 确切地说,每个物理处理器一个调度程序。 这消除了另一类要检查的锁。 仅在无聊的调度程序时,它才需要出去,收集锁并从另一个调度程序中获取一些进程。

在Java中,我们还有很多东西要学习。 就是说,我们在Java中有一些不错的东西,我错过了使用大型Erlang系统的情况。

当线程累积大量数据时, Erlang VM将重新分配并增加堆。 但是,重新分配算法导致堆大小快速增长。 在高负载下,我们已经看到Erlang VM在几分钟之内吞噬了16GB的RAM。 每个发行版都必须经过仔细的负载测试,以查看其内存需求是否仍然合理。

Erlang VM中没有任何机制可以抑制内存的增长。 VM会愉快地分配过多的内存,以至于系统需要进行交换,或者虚拟内存已用完。 这些可能会导致机器甚至无法响应KVM控制台访问。 过去,我们必须对机器重新通电才能重新访问它们。

基于队列的编程模型使Erlang为其编写代码变得非常有趣,这也是生产中的致命弱点。 Erlang中的每个队列都是无界的。 VM不会引发异常或限制队列中的消息数。 有时,进程会由于错误而停止处理,或者进程无法跟上发送给它的消息流的速度。 在这种情况下, Erlang将只允许该进程的队列增加,直到VM被杀死或计算机被锁定(以先到者为准)。

这意味着,当您在生产环境中运行大型Erlang VM时,您需要进行OS级别的检查,如果内存使用过多的话,这些检查将杀死进程。 对于运行大型Erlang VM的计算机,必须具有计算机的远程控制权或远程访问卡。

总之,对于每天的性能,我相信私有堆内存模型是Erlang盒子中非常强大的工具。 它将所有类型的锁定机制都排除在运行时系统之外,这意味着在相同的目的下,它将比Java更好地扩展。 当系统被洪水或DDoSed攻击时,Java对内存的严格限制将节省您的培根。

最后的想法

Erlang的VM有一个命令行开关,可以将其从使用私有堆拓扑切换到使用共享堆拓扑。

我喜欢Erlang和Java。 它们之所以难以比较,是因为它们与开发人员的共同点很少。 通常,我会在大多数系统上使用Java。 工具支持更好,可用库的数量惊人。 如果我有一个面向流的消息传递系统,我会选择Erlang 。 那时, Erlang编程模型才真正发光。

参考文献:

  • Java监视器的 JCG合作伙伴Kees Jan Koster提供的Erlang内存架构与Java内存架构

编码愉快! 不要忘记分享!

拜伦

相关文章:

  • Java最佳实践系列
  • 正确记录应用程序的10个技巧
  • 每个程序员都应该知道的事情
  • 生存在荒野西部开发过程中的9条提示
  • 软件设计法则
  • Java Fork / Join进行并行编程

翻译自: https://www.javacodegeeks.com/2011/04/erlang-vs-java-memory-architecture.html

erlang 架构原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC IOC 之AutoFac攻略

一、为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快…

android对话框跳转页面,android应用Dialog跳转到Activity

Java基础-四要素之一《多态》什么是多态 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的 ...java进制转换器 图形用户界面 十进…

apache cxf_Apache CXF负载平衡和故障转移

apache cxf不久前,我们已经面临了基于Apache CXF的负载平衡Web服务客户端的需求。 此外,当某些服务器关闭时,客户端应自动进行故障转移。 更糟糕的是,服务器目标地址列表要从外部服务获取并在运行时更新。 最终,我们最…

HDU 1874 最直接的最短路径问题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1874 Problem Description某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择&#xf…

晶体管

晶体管-沟道 场效应-电容性的控制沟道 势效应-直接控制沟道 平带电压 由于半导体和金属的功函数的不同,导致半导体表面层并不属于平带状态,为了恢复平带状态所加的电压为平带电压,Vfb 转载于:https://www.cnblogs.com/rice808/p/3874597.html…

领域驱动设计模式设计与实践_在域驱动设计中使用状态模式

领域驱动设计模式设计与实践域驱动设计(DDD)是一种开发软件的方法,其中,通过将实现与核心业务概念的不断发展的模型相联系,解决了问题的复杂性。 该术语是由Eric Evans创造的,并且有一个DDD专用站点可以促进…

html 英文文字纵向排列,CSS几种简单方法实现文字竖向排版

1.一个句子的竖向排列如图:1.2. test.one {width: 20px;margin: 0 auto;line-height: 24px;font-size: 20px;}.two {width: 15px;margin: 0 auto;line-height: 24px;font-size: 20px;word-wrap: break-word;/*英文的时候需要加上这句,自动换行*/}我是竖列…

jstree 节点拖拽保存数据库

需要jstree具有拖拽功能需要在加载jstree时添加dnd插件,具体看代码: $(**).jstree({//plugins-各种jstree的插件引入,展示树的多样性 plugins : [ "dnd", "types", "wholerow" ], core : {"check_callbac…

html js utf8编码转换,js 编码转换 gb2312 和 utf8 互转的2种方法

方法一:function gb2utf8(data){var glbEncode [];gb2utf8_data data;execScript("gb2utf8_data MidB(gb2utf8_data, 1)", "VBScript");var tescape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/…

向其他进程注入代码的三种方法

如何向其他线程的地址空间中注入代码并在这个线程的上下文中执行之? 目录:●导言●Windows 钩子(Hooks)●CreateRemoteThread 和LoadLibrary 技术○进程间通讯●CreateRemoteThread 和 WriteProcessmemory 技术○如何使用该技术子…

自动添加html结束标志,HTML:包含或排除可选的结束标记?

MYYA我在这里添加一些链接来帮助您了解HTML的历史,以便您了解各种矛盾。这不是你的问题的答案,但在阅读这些各种摘要后你会知道更多。我们是怎么来到这里的? - 潜入HTML5网络历史HTML简史HTML的历史 - HTML WG WikiDive Into HTML5的一些摘录…

JAR清单类路径不仅适用于Java Application Launcher

自从我开始学习Java以来​​,我几乎已经知道, 清单文件中的Class-Path标头字段为可执行JAR (具有由另一个称为Main-Class清单指定应用程序起点的 JAR)指定相对运行时类路径。 一个同事最近碰到一个让我感到惊讶,因为它…

[原创]ActionScript3游戏中的图像编程(连载五)

总目录:http://www.cnblogs.com/iloveas/p/3879125.html 1.1.2 Flash中的ARGB模式与不透明度的关系 ARGB是Flash,svg等矢量处理软件特有的一种色彩模式,事实上我觉得它有点扯淡,A(alpha)不应该作为一个通道…

通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL

在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点。开始创建一个以下内容的 HTML 文件,并在浏览器中打开。JavaScript URL parsing// 激动人心的代码即将写在这里如果你想尝试本文中的任何内容,可以…

define 汉字 error C2001: newline in constant

这个问题真的很让我头大,搜了很多办法都不行,问题是我之前也遇到过,但是编码转为utf-8 unsignature就行了,这次把编码从gb转为utf-8 unsignature 却不行。于是想看看cocos2d-x库文件的编码格式,发现用的是utf-8&#x…

solaris安装java_Solaris是出色的Java开发平台的原因

solaris安装java几天前,我发布了“ OpenSolaris的死亡:为Java开发人员选择操作系统 ”,其中我说Solaris是Java开发人员的绝佳平台。 这篇文章的重点只是想知道自OpenSolaris淘汰以来我将使用哪个Solaris版本。 正如Neil的评论使我意识到的那样…

正确使用计算机说课稿,《计算机结构原理初步》说课稿

在教师招聘考试的过程中,高中信息说课稿的难度就在于如何处理理论与实践的关系,希望这篇《计算机结构原理初步》说课稿能给予你帮助。各位考官大家好!我是号考生,今天我说课的题目是《计算机结构原理初步》。现代教学理论认为,在教…

stringstream实例

stringstream的具体作用稍后来总结&#xff0c;这里分享一个实例&#xff0c;从txt文档中读取数据&#xff0c;并对进行处理。 #include <iostream> #include <sstream> //stringstream的头文件 #include <fstream> #include <vector> #include <s…

计算机2013知识,2013年全国计算机一级考试B基本知识点五

基础5单元格操作对已建立的工作表&#xff0c;根据需要可以编辑修改其中的数据首先要移动单元格指针到目的地或选定编辑对象&#xff0c;然后才能进行增、删、改操作。1.单元格指针的移动要编辑某单元格&#xff0c;必须把单元格指针移动到该单元格&#xff0c;使之成为当前单元…

两种解决IE6不支持固定定位的方法

有两种让IE6支持position:fixed1.用CSS执行表达式 *{margin:0;padding:0;} * html,* html body{ background-image:url(about:blank);background-attachment:fixed; } * html .fixed{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTopdoc…