AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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:4911369
用户头像

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

关注

评论

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

为什么我的 C4C Service Request 没办法 Release 到 ERP?

汪子熙

Cloud SAP abap C4C 11月日更

JSON 数据格式

大数据技术指南

11月日更

HyperLogLog这里面水很深,但是你必须趟一趟

李子捌

redis 签约计划第二季

Linux 调优之:调整 bond hash 策略提升网络吞吐能力

卫智雄

k8s statefulset controller源码分析

良凯尔

源码 Kubernetes 源码分析 #Kubernetes#

跟小师妹一起学JVM-系列文章

程序那些事

Java JVM JIT 内容合集 签约计划第二季

URL URI傻傻分不清楚,dart告诉你该怎么用

程序那些事

flutter dart 程序那些事 11月日更

Redis的LRU(Least Recently Used)算法你了解多少?

李子捌

redis 签约计划第二季

Redis高可用的绝对的利器——持久化(RDB和AOF)

李子捌

redis redis持久化 签约计划第二季

限流系列文章——滑动窗口限流

李子捌

redis 限流 签约计划第二季

Prometheus Exporter (十三)Elasticsearch Exporter

耳东@Erdong

elasticsearch Prometheus exporter 11月日更

2021年大数据开发发展趋势

五分钟学大数据

11月日更

在线文本交集计算工具

入门小站

工具

数据库不能没有事务,今天他来了——Redis事务详述

李子捌

redis 事务 签约计划第二季

听说你的服务经常被打崩?试试布隆过滤器(Bloom Filter)

李子捌

redis 布隆过滤器 签约计划第二季

Skip List(跳跃列表)它到底好在哪?今天我们不仅只聊为什么,还手写一个玩玩

李子捌

redis skiplist 签约计划第二季

【高并发】如何使用Java7提供的Fork/Join框架实现高并发程序?

冰河

Java 并发编程 多线程 高并发 异步编程

LRU经常被吐槽,要不试试LFU?本文详述LFU(Least Frequently Used)

李子捌

redis 签约计划第二季

都在用MQ,Redis的Pub/Sub也可以试着了解下

李子捌

redis MQ 签约计划第二季

李子捌 Redis精通系列文章 研究分享| 内容合集

李子捌

redis 内容合集 签约计划第二季 技术专题合集

数据分析从零开始实战,Pandas读写Excel/XML数据

老表

Python 数据分析 Excel pandas 11月日更

Redis之Geospatial,助你轻松实现附近的xx功能

李子捌

redis geospatial 签约计划第二季

签到功能怎么做?Bitmaps助你一臂之力

李子捌

redis bitmaps 签约计划第二季

限流系列文章——漏斗限流

李子捌

redis 限流 签约计划第二季

CSS之盒模型

Augus

CSS 11月日更

SAP Cloud for Customer Price 计价简介

汪子熙

Cloud SAP C4C 11月日更 pricing

ES6, Angular, React 和 ABAP 中的 String Template(字符串模板)

汪子熙

JavaScript angular React abap 11月日更

linux双向重定向之tee命令

入门小站

Linux

限流系列文章——令牌桶限流

李子捌

redis 限流 签约计划第二季

[Pulsar] 消息从Producer到Broker的历程

Zike Yang

Apache Pulsar 11月日更

云原生训练营作业--部署k8s集群

好吃不贵

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