你可以在Sun VM的Dalvik VM(Android的VM)上做什么?

我知道你可以在Dalvik的虚拟机中运行几乎所有的Java,但是这个限制并不是很清楚。 有没有人遇到任何主要的绊脚石? 任何大型图书馆都有麻烦? 任何编译为Java字节码( ScalaJython等)的语言都不能按预期工作?

有很多Dalvik不能处理或者不能像标准的Java字节码那样处理的东西,虽然其中大部分是相当先进的。

最严重的例子是运行时字节码生成和自定义类加载。 假设你想创build一些字节码,然后使用类加载器为你加载,如果这个技巧在你的普通机器上运行的话,除非你改变字节码的生成,否则保证不能在Dalvik上工作。

这可以防止你使用某些dependency injection框架,最着名的例子是谷歌Guice(虽然我相信有人在这方面工作)。 另一方面,AspectJ应该像使用字节码检测一样编译(尽pipe我不知道是否有人试过)。

至于其他jvm语言 – 任何最终编译为标准字节码,并且在运行时不使用字节码检测的任何东西都可以转换为Dalvik,并且应该可以工作。 我知道人们在Android上运行Jython,并且工作正常。

还有一点要注意的是, 没有及时编译 。 这不是严格的Dalviks问题(如果你愿意的话,你可以随时编译任何字节码),但Android不支持,不太可能这样做。 在标准Java的微基准testing毫无用处的情况下,组件在testing中具有不同的运行时特性,而不是大型系统的一部分 – Android手机的微基准testing完全有意义。

如果您看到“ Dalvik虚拟机内部 ”Google IO会话,您可以发现Dalvik不支持分代GC 。

所以,这可能会降低频繁创build和删除对象的性能。 Java VM支持分代GC,因此在相同的情况下,它将显示更好的GC性能。

而且,Dalvik使用trace-granuality JIT而不是方法granitity JIT。

另外一个我猜测可以在这里添加的是,Dalvik在使用reflectionAPI列出类的字段时显然不保留字段顺序。 现在,reflectionAPI无论如何也没有做出任何保证(理想情况下,你不应该依赖它),但是大多数其他虚拟机在那里保持顺序。

只是添加到对话中,而不是为了恢复旧的线程。 我只是在search中遇到了这个问题,并且想要补充的一点是,Jython并不能与Dalvik一起使用。 简单地尝试做一个你好世界的例子将产生以下内容: