在Sun VM中可以在Dalvik VM(Android的VM)上执行哪些操作?

问题描述:

我知道你可以在Dalvik的虚拟机中运行几乎所有的Java,你可以在Java的虚拟机但是这个限制不是很清楚。有没有人遇到过任何主要的绊脚石?任何主要图书馆遇到麻烦?编译为Java字节码的任何语言(斯卡拉,Jython等等)不能按预期工作?在Sun VM中可以在Dalvik VM(Android的VM)上执行哪些操作?

Dalvik无法处理或处理的方式与标准Java字节码的处理方式有很多相似之处,尽管其中大部分都非常先进。

最严重的例子是运行时字节码生成和自定义类加载。假设您想创建一些字节码,然后使用classloader为您加载它,如果该技巧适用于您的普通机器,那么除非您更改字节码生成,否则它将无法在Dalvik上运行。

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

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

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

+6

几个更新: 有一个特殊版本的Guice将在Android上工作。 http://code.google.com/p/google-guice/downloads/detail?name=guice-2.0-no_aop.jar 谷歌有一个团队正在开发面向Android的JIT。 http:// groups。google.com/group/android-platform/browse_thread/thread/331d5f5636f5f532 – 2009-12-19 02:25:54

如果您看到“Dalvik Virtual Machine internals”Google IO会话,您会发现Dalvik不支持generational GC

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

此外,Dalvik使用trace-granuality JIT而不是方法granityity JIT。

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

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