在Dalvik VM(Android的VM)上你不能做什么,你可以在Sun VM中做什么?
我知道你可以在Dalvik的VM中运行几乎所有的Java,就像在Java的VM中一样,但限制不是很清楚。有没有人遇到过任何重大的绊脚石?是否有任何主要图书馆遇到问题?任何编译为Java字节码的语言(Scala,Jython等)无法按预期工作?
我知道你可以在Dalvik的VM中运行几乎所有的Java,就像在Java的VM中一样,但限制不是很清楚。有没有人遇到过任何重大的绊脚石?是否有任何主要图书馆遇到问题?任何编译为Java字节码的语言(Scala,Jython等)无法按预期工作?
Dalvik不会处理或不会以与标准Java字节码完全相同的方式处理许多事情,尽管其中大多数都非常先进。
最严重的例子是运行时字节码生成和自定义类加载。假设你想创建一些字节码,然后使用classloader为你加载它,如果这个技巧在你的普通机器上有效,那么除非你改变字节码的生成,否则它保证在Dalvik上不起作用。
这可以防止你使用某些依赖注入框架,最着名的例子是Google Guice(尽管我相信有些人会这样做)。另一方面,AspectJ应该工作,因为它使用字节码检测作为编译步骤(尽管我不知道是否有人尝试过)。
至于其他jvm语言 - 任何最终编译为标准字节码并且在运行时不使用字节码工具的东西都可以转换为Dalvik并且应该工作。我知道人们确实在Android上运行了Jython,它工作正常。
另一件需要注意的事情是,没有及时的编译。这不是严格的Dalviks问题(如果你愿意,你可以随时动态编译任何字节码),但Android不支持它,也不太可能这样做。虽然标准Java的微模板标记是无用的 - 组件在测试中的运行时特征与作为大型系统的一部分具有不同的运行时特征 - 但Android手机的微模板标记是完全有意义的。
如果你看到“Dalvik Virtual Machine internals”Google IO会话,你会发现Dalvik不支持代际GC。
因此,它可能会降低频繁创建和删除对象的性能。Java VM支持代际GC,因此,在相同情况下,它将显示出更好的GC性能。
此外,Dalvik使用痕量粒度JIT而不是方法粒度JIT。