硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

JamVM:开源的超小型 Java 虚拟机

  • 2014-09-29
  • 本文字数:1368 字

    阅读完需:约 4 分钟

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 具有以下特性:

  • 执行引擎支持从基本的使用 switch 实现简单的指令分派处理的解释器到使用栈缓存的内联的解释器多层次的优化(等效于一个简单的 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。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-09-29 04:4911541
用户头像

发布了 92 篇内容, 共 50.7 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

【Go实现】实践GoF的23种设计模式:工厂方法模式

元闰子

Go 设计模式 工厂方法模式

模块6作业提交

KennyQ

模块六作业 微服务拆分

库尔斯

架构实战营

PostgreSQL出现死锁怎么办?

慕枫技术笔记

数据库 5月月更

后端开发【一大波干货知识】Redis中的IO多线程(线程池)

C++后台开发

redis 多线程 线程池 后端开发 C++后台开发

密码学系列之:在线证书状态协议OCSP详解

程序那些事

密码学 程序那些事 5月月更

跨平台应用开发进阶(十) :uni-app 实现数据存储、获取和删除

No Silver Bullet

uni-app 数据存储 5月月更 全局

滑动窗口

工程师日月

算法 5月月更

程序员如何保证自己开发的正确性——测试开发有感

Bruce Talk

技术 敏捷 TDD Agile

拆分电商系统为微服务

Dean.Zhang

python小知识-python 函数二三事

AIWeker

Python 5月月更

Sentinel介绍与使用 收藏起来

牧小农

sentinel

Flutter 使用 Provider 实现嵌套状态管理

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

模块六:作业

本人法海

「架构实战营」

小公司里面的 Python 后端,数据库(MySQL)到底要学习到什么程度?

梦想橡皮擦

5月月更

linux之crontab使用技巧

入门小站

Linux

电商系统微服务拆分

Trent

架构 微服务拆分 电商 训练营

VS Code配置markdown代码片段

空城机

前端 vscode 5月月更

全链路压测(十三):高可用和性能优化

老张

性能测试 全链路压测 稳定性保障

Linux环境编译多个C程序文件

Loken

音视频 5月月更

谷歌三件套 - Bigtable

懒时小窝

bigtable 谷歌 谷歌三件套

Java Core「1」JUC-线程基础

Samson

学习笔记 5月月更 Java core

在线蚂蚁文,菊花文生成工具

入门小站

工具

【Meetup 预告】OpenMLDB x DolphinScheduler 链接特征工程与调度环节,打造端到端 MLOps 工作流

第四范式开发者社区

人工智能 机器学习 数据库 调度 特征工程

深入剖析 | snowflake算法

九叔(高翔龙)

算法 雪花算法 uuid 全局唯一ID snowflake

实现compact table command

Asha

跨平台应用开发进阶(九) :uni-app 实现Android原生APP-本地打包集成极光推送(JG-JPUSH)详细教程

No Silver Bullet

uni-app Andriod 极光推送 5月月更 本地打包

【C 语言】指针 Five 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]

謓泽

C语言 5月月更

单片机上常用-GB2312、GBK汉字取模与字库偏移地址的计算与汉字描点

DS小龙哥

5月月更

八、浅谈云原生监控

穿过生命散发芬芳

云原生 5月月更

【刷题第15天】剑指 Offer 09. 用两个栈实现队列

白日梦

5月月更

JamVM:开源的超小型Java虚拟机_Java_李士窑_InfoQ精选文章