Erlang与Java内存架构

我读了一篇关于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编程模型才真正发光。

参考文献:

  • 我们的JCG合作伙伴Kees Jan Koster (来自Java-Monitor)的 Erlang内存架构与Java内存架构

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

拜伦

相关文章:

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

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

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

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

相关文章

Xuggler教程:转码和媒体修改

注意:这是我们的“ Xuggler开发教程 ”系列的一部分。 在之前的教程中,我对视频处理Xuggler进行了简短介绍 。 在这一部分中,我们将看到Xuggler和FFmpeg提供的一些更令人兴奋的功能,例如视频转码和媒体修改。 不要忘记Xuggler是一…

Web工程师必备的43款可视化工具

国外站点DATAVISUALIZATION.CH为大家总结出了当前热用的43款可视化工具,包括Arbor、Chroma.js、D3.js、Google Chart Tools等,绝对让你一饱眼福。 1.Arbor.js Arbor是一个免费的、可视化的图形库,基于矢量创建动态的连接图。它为图形组织和屏…

力扣7. 整数反转

方法一&#xff1a;官方给的&#xff0c;自己懂了后照着敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判断条件过于复杂&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name属性

被这个不起眼的属性折磨了一天&#xff0c;终于解决了。 由于项目需要&#xff0c;要合并两个android应用&#xff0c;于是拷代码&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序还是频频崩溃&#xff0c;一直没有找到原因&#xff0c;学android…

完美单身

我不时遇到一些Java程序员&#xff0c;他们不确定他们应该如何正确实现Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;请尝试Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在谈论在线程环境中的正确实现。 但是&#xff0c;使用最常见的…

力扣移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 我写的代码思路是从开始元素找0&#xff0c;找到了就将这个0后面的元素向前移一位 class Solution {public void moveZeroes(int[] nums) {int n nums.length;…

Doclava:来自Google的自定义Javadoc Doclet

Doclava是Google的自定义Javadoc Doclet&#xff0c;由Google Guice使用&#xff08;请参阅稍冷的 Javadocs &#xff09;。 Doclava使用JSilver作为其模板引擎&#xff0c;这是Clearsilver的纯Java实现。 我个人喜欢联合文档的想法&#xff0c;它允许文档在打开的项目上相互链…

linux cat显示若干行

【一】从第3000行开始&#xff0c;显示1000行。即显示3000~3999行 cat filename | tail -n 3000 | head -n 1000 【二】显示1000行到3000行 cat filename| head -n 3000 | tail -n 1000 *注意两种方法的顺序 分解&#xff1a; tail -n 1000&#xff1a;显示最后1000行 tail -n …

【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值

问题java中&#xff0c;怎样推断数组Array是否包括指定的值精华回答1.Arrays.asList(...).contains(...) 2.使用 Apache Commons Lang包中的ArrayUtils.containsString[] fieldsToInclude { "id", "name", "location" };if ( ArrayUtils.contai…

力扣移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

在域驱动设计中使用状态模式

域驱动设计&#xff08;DDD&#xff09;是一种软件开发方法&#xff0c;其中&#xff0c;通过将实现与核心业务概念的不断发展的模型相连接&#xff0c;可以解决问题的复杂性。 该术语是由Eric Evans创造的&#xff0c;并且有一个DDD专用站点可以促进其使用。 根据其定义&#…

使用selenium进行密码破解(绕过账号密码JS加密)

经常碰到网站&#xff0c;账号密码通过js加密后进行提交。通过burp拦截抓到的账号密码是加密后的&#xff0c;所以无法通过burp instruder进行破解。只能模拟浏览器填写表单并点击登录按钮进行破解。于是想到了自动化web测试工具selenium&#xff0c;代码如下&#xff0c;测试效…

力扣删除排序数组中的重复项

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 我没注意到“有序”这一条…

POJ1789-Truck History .

题目链接&#xff1a;http://poj.org/problem?id1789 题目的大概意思就是给你n个字符串。每个字符串只有7的长度。然后分别给这些字符串编号。不同编号之间的距离就是他们有多少个不同的字母。&#xff08;同一个位置字母不相同也算&#xff09;然后一个编号只能由另一个派生…

Java Fork / Join进行并行编程

最近几年&#xff0c;计算机处理器领域发生了范式转变。 多年来&#xff0c;处理器制造商一直在提高时钟频率&#xff0c;因此开发人员享受到这样的事实&#xff0c;即他们的单线程软件执行得更快&#xff0c;而无需他们付出任何努力。 现在&#xff0c;处理器制造商青睐多核芯…

arm-elf-gcc交叉编译器的使用教程

arm-elf-gcc交叉编译器的使用教程 一开始需要安装arm-elf-gcc&#xff0c;但是这是一个32位的程序&#xff0c;我是安装了64位的系统&#xff0c;据说安装ia32.libs依赖库能运行这个&#xff0c;但是看到博客上面前人安装完了系统图标少了一半&#xff0c;然后就怕了。经过了翻…

力扣删除排序数组中的重复项 II

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 最多出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 思路&#xff1a; 双指针…

2 android学习资料

http://blog.csdn.net/lmj623565791 http://blog.csdn.net/harvic880925/article/details/50995268转载于:https://www.cnblogs.com/YyuTtian/p/5440930.html

建立自己的GWT Spring Maven原型

大家好&#xff0c; 在观看Justin撰写的有关Spring和GWT的非常有趣的文章时&#xff0c;我认为展示如何构建自己的自定义Maven原型非常有用。我们将展示的原型基于Justin的上一个项目&#xff0c;并包括各种技术&#xff0c;例如Spring &#xff0c; GWT &#xff0c; AspectJ…

C# 连接Oracle数据库异常总结

这2天因为工作需要连接Oracle数据库&#xff0c;中间发生了很多问题 一、使用OleDbConnection连接数据库 ------------------ ProviderOraOLEDB.Oracle.1;User IDsajet;Passwordtech;Data Source(DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.66.225)(…