BEAM和JVM之间有哪些基本的功能/架构差异?
答案 0 :(得分:17)
首先,Beam是一台注册机,而不是堆栈机。与Prolog的WAM一样,它使用“X寄存器”,它们是普通寄存器(在C中实现为数组),“Y寄存器”是本地功能激活记录中的插槽名称(“调用帧”)在堆栈上。没有堆栈操作指令。
其次,有一些指令可以快速分配更多的堆内存,用于初始化堆上的元组和其他数据结构,用于选择元组的元素等.JVM专注于对象,并且具有“新”隐藏内存分配和基本初始化细节的操作。
BEAM有一条指令,用于递减流程的“减少计数器”,并决定是否需要让另一个流程运行。另一方面,JVM具有线程的同步指令。
一个重要的区别是BEAM有尾调用指令,JVM缺乏这些指令。
最后,对于BEAM和JVM,目标文件中使用的指令集实际上只是一种传输格式。 BEAM仿真器将文件中的指令重写为内部版本,其中包含许多优化的特殊情况指令(可以从一个版本更改为另一个版本)。或者,您可以编译为本机代码。大多数JVM都做同样的事情。
答案 1 :(得分:1)
其他一些有趣的观点是:
进程是BEAM公民,由VM本身管理,而JVM将其管理委托给操作系统。这允许BEAM非常快速地管理(创建,删除,上下文切换......),从而能够在合理的机器上管理数十万个进程而不是数百个Java线程。
在BEAM上,进程间通信基于消息交换,消除了大多数(如果不是所有)可能导致竞争条件的情况。在Java上,您需要同步很难且容易出错的线程。
重要的一点是,垃圾收集是在BEAM中基于每个进程完成的,而它是JVM中的全局进程。其影响是JVM上的GC可能会冻结整个VM几秒钟,而在BEAM上,每个进程必须向GC执行一些执行操作(减少),而不会影响其他进程。< / p>
最近,一些新的库,例如VertX(我真的不知道Akka,但我相信它就是这种情况)JVM语言开始实现类似的流程行为来尝试解决问题1.和2.我认为GC的问题不能通过简单的库来解决。