我知道您可以在 Java的VM 中运行 Dalvik的VM 中的几乎所有Java,但限制不是很明确。有没有人遇到任何重大绊脚石?有没有主要图书馆有问题?任何编译为Java字节代码( Scala , Jython 等...)的语言都无法正常工作?
答案 0 :(得分:33)
Dalvik有许多东西不能处理或不会处理与标准Java字节码完全相同的方式,尽管其中大多数都是非常先进的。
最严重的例子是运行时字节码生成和自定义类加载。假设您想创建一些字节码,然后使用类加载器为您加载它,如果该技巧在您的普通机器上运行,则保证不会在Dalvik上运行,除非您更改字节码生成。
这会阻止您使用某些依赖注入框架,最着名的例子是Google Guice(尽管我确信有些人会参与其中)。另一方面,AspectJ应该工作,因为它使用字节码检测作为编译步骤(虽然我不知道,如果有人尝试过)。
对于其他jvm语言 - 最终编译为标准字节码并且在运行时不使用字节码检测的任何东西都可以转换为Dalvik并且应该可以工作。我知道人们在Android上运行Jython并且运行正常。
要注意的其他事情是没有及时编译。这不是严格的Dalviks问题(如果你愿意,你可以随时编译任何字节码),但Android不支持,并且不太可能这样做。实际上,标准Java的微基准测试毫无用处 - 组件在测试中具有与大型系统不同的运行时特征 - Android手机的微基准测试完全有意义。
答案 1 :(得分:11)
如果您看到“Dalvik Virtual Machine internals”Google IO会话,则可以找到Dalvik不支持generational GC。
因此,它可能会降低频繁创建和删除对象的性能。 Java VM支持分代GC,因此在相同的情况下它会显示更好的GC性能。
此外,Dalvik使用trace-granuality JIT代替方法粒度JIT。
答案 2 :(得分:2)
我想在这里添加的另一件事是,在使用反射API列出类的字段时,Dalvik显然不保留字段顺序。现在,反射API无论如何都不会对它做任何保证(理想情况下你不应该依赖它),但是大多数其他虚拟机做保留了订单。
答案 3 :(得分:-1)
只是为了添加到对话中,而不是为了恢复旧的线程。我刚刚在我的搜索中遇到过这个问题,并希望补充说Jython与Dalvik的开箱即用。简单地尝试做一个hello world示例将产生以下结果: