JamVM是一个开源的Java虚拟机,遵从GPL2.0协议发布,它符合最新的Java虚拟机规范。它的主要特点是其大小非常小,在PowerPC上仅有大约200KB,而在Intel处理器上仅有180KB。不像其他的小型虚拟机(如Jelatine JVM、SableVM等),JamVM支持完整的Java虚拟机规范。从SourceForge的JamVM站点得知,今年7月底,JamVM 2.0.0发
布,这是首个支持OpenJDK 的版本(包括 6、7和最新的8版本),该版本完全支持动态调用(JSR 292)、 Lambda 表达式和类型注解
(JSR 308)以及方法参数反射。同时,还修复了大量的Bug ,性能和兼容性也得到了改进,更多JamVM 2.0.0相关信息请查看发布说明。JamVM具有以下特性:
- 执行引擎支持从基本的开关解释器到使用栈缓存的内联的解释器多层次的优化(等效于一个简单的JIT编译器)
- 使用原生的线程(POSIX线程),并实现了线程的所有内容
- 为了快速锁定,在非竞态条件下使用高效的thin locks代替spin-locking
- 使用信号标识实现线程的暂停,在正常执行过程中无需检查暂停,从而降低了延迟和提高了性能
- 在垃圾收集器中使用终结线程支持完整对象的终结
- 完全支持类和类加载器的垃圾收集和卸载( 包括相关的共享库)
- 支持指针的对象引用和类加载器
- 完全支持软、弱、虚引用
- 垃圾收集器能够以同步或者异步方式运行在自己的线程中
- 类文件中的字符串常量以哈希表的形式存储,使得类之间能够共享字符串常量,从而减少了类数据的加载
- 支持Java本地接口和独立加载标准的lib库
- 内部本地方法使用新实现的轻量级本地接口,而没有使用Java本地接口(Java Native Interface)
- 支持Lambda 表达式(JSR 335)、支持类型注解(JSR 308)、支持方法参数的映射、支持动态调用(JSR 292)
- 主要使用C语言编写,只用了少量依赖平台的汇编程序,所以能够很容易移植到其他架构上
另外,JamVM的解释器经过了高度优化,吸收了许多最新的技术如堆栈缓存和direct-threading(直接线程)技术。其最新版本扩展了
这些,包括一个代码复制的JIT编译器,且编译器也可移植。同时,JamVM为了支持UNIX和POSIX兼容的系统进行了重写,不过在UNIX系统之间
仍然存在不兼容的情况。另外,一些架构需要专门的配置(如内存故障等),最后本地调用约定(或者应用二进制接口)是与平台和架构相关的。JamVM支持的
主要系统和框架如下:
- Linux系统: x86、x86_64、ARM、PowerPC、PowerPC64(*)、MIPS、HPPA
- FreeBSD系统: x86、x86_64、ARM、PowerPC、PowerPC64(*)、SPARC(*)
- OpenBSD系统: x86、x86_64、ARM、PowerPC、PowerPC64(*)、SPARC(*)
- Mac OS X/Darwin系统: x86、x86_64、ARM、PowerPC、PowerPC64
- Solaris/OpenSolaris系统: x86、x86_64
- KFreeBSD系统: x86
其中带星号(*)的架构需要使用libffi进行配置。
另外,非常著名的Android虚拟机DVM(Dalvik Virtual Machine
)是基于寄存器实现,它是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。2006年,DVM还在开发中,Google的
Android团队就使用JamVM开发应用框架。2007年DVM发布, Android团队才使用DVM取代JamVM。
转自 http://www.infoq.com/cn/news/2014/09/jamvm?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global |