我知道你可以在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手机的微基准测试完全有意义。
如果您看到“Dalvik Virtual Machine internals”Google IO会话,您会发现Dalvik不支持generational GC。
因此,它可能会降低频繁对象创建和删除的性能。 Java VM支持分代GC,所以它可以在相同的情况下显示更好的GC性能。
此外,Dalvik使用trace-granuality JIT而不是方法granityity JIT。
另外一个我猜测可以在这里添加的事情是Dalvik在使用反射API列出类的字段时显然不保留字段顺序。现在,反射API无论如何都没有做出任何保证(所以理想情况下你不应该依赖它),但大多数其他虚拟机在那里做保持顺序。
只是添加到对话中,而不是为了恢复旧线程。我只是在搜索中遇到了这个问题,并且想补充说Jython不能与Dalvik一起使用。简单地试图做一个你好世界的例子将产生以下结果:
- 1. 直接在桌面上执行Dalvik VM
- 2. 调试Dalvik VM
- 3. Android,是否可以在任何类型的操作系统上运行Dalvik VM以运行Android应用程序?
- 4. dalvik vm的垃圾收集
- 5. Dalvik VM调用问题
- 6. VirtualBox VM中的VirtualBox VM
- 7. 垃圾收集在Android 4.2 Jelly bean Dalvik VM中如何工作?
- 8. 什么是Sun VM与IBM VM -Xcheck等效的选项:jni:alwayscopy?
- 9. 是否可以在Android VM中在运行时检测ABI?
- 10. 执行时间Cloudera VM
- 11. 什么是Dalvik VM的同步代码?
- 12. 类初始化问题在Android中加载java.util.logging.LogManager Dalvik VM
- 13. 在Valgrind下的Sun VM中运行JNI应用程序
- 14. SL4/MVVM:在VM
- 15. 在VM启动
- 16. WPF在VM
- 17. Dalvik VM错误:发现异常“Javax.xml.namespace.QName.class”
- 18. Dalvik VM找不到多个方法
- 19. Dalvik VM如何访问I/O?
- 20. 从VM到Docker - 了解哪些容器在哪些主机上运行
- 21. String.getBytes(“UTF-32”)在JVM和Dalvik VM上返回不同的结果
- 22. 哪些VM或GC支持JNI锁定?
- 23. Android VM堆大小
- 24. 在Android VM上安装Chrome浏览器?
- 25. 有没有办法在vm中找到vm的主机名?
- 26. Android Studio中的VM不工作
- 27. 如何在CDH5.1 VM
- 28. Cloudera QuickStarts VM在Ubuntu
- 29. 如何我在VM
- 30. 如何在Oracle VM上运行命令
几个更新: 有一个特殊版本的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