Java 在Dalvik虚拟机(Android';s虚拟机)上,您不能在Sun虚拟机上做什么?

Java 在Dalvik虚拟机(Android';s虚拟机)上,您不能在Sun虚拟机上做什么?,java,android,jvm,dalvik,Java,Android,Jvm,Dalvik,我知道你可以在Dalvik的虚拟机上运行几乎所有的Java,就像在Java的虚拟机上一样,但是限制还不是很清楚。有人遇到过什么大的绊脚石吗?有没有大型图书馆遇到问题?任何编译成Java字节码的语言(Scala、Jython等)都不能按预期工作 有许多事情Dalvik不会处理,或者不会以与标准Java字节码完全相同的方式处理,尽管它们中的大多数都非常先进 最严重的例子是运行时字节码生成和自定义类加载。假设您想创建一些字节码,然后使用classloader为您加载它,如果这个技巧在您的普通机器上有效

我知道你可以在Dalvik的虚拟机上运行几乎所有的Java,就像在Java的虚拟机上一样,但是限制还不是很清楚。有人遇到过什么大的绊脚石吗?有没有大型图书馆遇到问题?任何编译成Java字节码的语言(ScalaJython等)都不能按预期工作

有许多事情Dalvik不会处理,或者不会以与标准Java字节码完全相同的方式处理,尽管它们中的大多数都非常先进

最严重的例子是运行时字节码生成和自定义类加载。假设您想创建一些字节码,然后使用classloader为您加载它,如果这个技巧在您的普通机器上有效,那么它保证不会在Dalvik上工作,除非您更改字节码的生成

这使得您无法使用某些依赖项注入框架,最著名的例子是GoogleGuice(尽管我相信有人在做这方面的工作)。另一方面,AspectJ应该可以工作,因为它使用字节码插装作为编译步骤(尽管我不知道是否有人尝试过)

至于其他jvm语言——任何最终编译成标准字节码并且在运行时不使用字节码插装的语言都可以转换成Dalvik,应该可以工作。我知道人们确实在Android上运行了Jython,而且运行正常

需要注意的另一件事是,没有即时编译。这并不是严格意义上的Dalviks问题(如果您愿意,您可以随时编译任何字节码),但Android不支持,也不太可能这样做。实际上,虽然标准Java的微基准标记毫无用处——组件在测试中的运行时特征与作为大型系统的一部分不同——但Android手机的微基准标记完全有意义。

如果您看到“”Google IO会话,您会发现Dalvik不支持

因此,它可能会降低频繁创建和删除对象的性能。JavaVM支持分代GC,因此,对于相同的情况,它将显示更好的GC性能


另外,Dalvik使用granuality JIT来代替方法。

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

只是为了增加谈话内容,而不是为了重提旧话题。我只是在搜索中遇到了这个问题,我想补充一点,Jython也不适合Dalvik。只要尝试做一个hello world示例,就会得到以下结果:

一些更新:有一个特殊的Guice版本可以在Android上运行。谷歌有一个团队正在为Android开发JIT。Android Froyo支持跟踪粒度JIT编译器。查看如何在android上使用guice。运行时字节码加载实际上是可能的,但不适用于.class文件。使用,您可以从.jar文件中的.dex文件加载代码。(Android上的Clojure通过运行JVM到Dalvik编译器并将其包含在应用程序中来加载JVM字节码。虽然这样做有效,但速度非常慢。)