我读了一篇关于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

Erlang与Java内存架构相关推荐

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

    erlang 架构原理 我读了一篇关于Erlang VM的内存管理策略的非常非常有趣的文章. 它是Jesper Wilhelmsson撰写的论文 ,我认为讨论Erlang的内存设置和Oracle的Ja ...

  2. 深入理解Java内存架构

    hi,大家周末好,今天给大家带来一篇硬核的技术文章,本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果, ...

  3. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  4. Java内存体系结构(模型),垃圾回收和内存泄漏

    Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在每种世代类型之间分配允许 ...

  5. Erlang与java的内存架构比较

    http://blog.sina.com.cn/s/blog_541086000100qod1.html 我读了一篇非常非常有趣的文章(Jesper Wilhelmsson的一篇论文),是关于Erla ...

  6. java内存shell_2019蚂蚁金服Java后端三面,详述程序员必须掌握的架构底层原理

    前面的话 告别了2018 ,也早已正式进入2019 面试一直都是大家关注的热门话题,俗话说"金三银四",如今已经是三月份了,如果你打算在年后跳槽,那么是时候该着手准备了 很多Jav ...

  7. JVM——CPU缓存架构与Java 内存模型

    导航 一.CPU缓存架构与一致性协议 1.1 CPU缓存架构 1.2 缓存行与伪共享问题 1.3 MESI 缓存一致性协议 1.4 伪共享的解决办法 二.JMM Java 内存模型 2.1 JMM 简 ...

  8. java基础—java内存模型(JMM)CPU架构、缓存一致性、重排序、JMM的实现、JMM保证可见性、有序性问题的详解

    java基础-JMM(CPU架构.JMM保证可见性.有序性) 文章目录 java基础-JMM(CPU架构.JMM保证可见性.有序性) CPU架构 说一说现在计算机存储器的结构层次 使用CPU缓存,会导 ...

  9. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

最新文章

  1. 解决谷歌浏览器在非https下限制获取多媒体对象(音视频)的解决方式
  2. 青春就是一无所有,梦想就是坚持走下去
  3. 低头族的第三只眼,“赛博朋克”新装备让你走路不再撞树
  4. pymysql的相关操作
  5. java- 和 || 优先级的问题
  6. 一个类型初始值设定项引发异常
  7. python random库下载_python基础 — random库
  8. The Architecture of Open Source Applications
  9. 什么是顺序执行以及其特点
  10. “通讯录不属于用户隐私”?今日头条:绝对不认可这个说法
  11. LUNA16数据集介绍
  12. sqlsever 创建一个通用分页查询
  13. python实现阿拉伯数字和罗马数字的互相转换
  14. 阿肯色大学计算机,阿肯色大学怎么样?
  15. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
  16. 检测OTU序列遗传发育信号的R实现
  17. php属于哪种语言,php是哪种类型的语言
  18. 知识变现海哥|知识变现需要使用哪些工具
  19. 小木虫好中的ei期刊图像处理
  20. 一本通1645Fibonacci

热门文章

  1. 如何实现下拉框的绑定
  2. Spring boot(六):如何优雅的使用mybatis
  3. java 异常 最佳实践_处理Java异常的10种最佳实践
  4. aws ec2 跨帐号共享_AWS共享资源的警告
  5. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...
  6. 将经过身份验证的用户注入Spring MVC @Controllers
  7. java 枚举 菜鸟_2个菜鸟Java常量和枚举陷阱
  8. λ演算的语法和语义_λ和副作用
  9. 与OutOfMemoryError相关的JVM参数
  10. aws iam 架构图_使用IAM保护您的AWS基础架构