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