java - caracteristicas - ¿Qué no puedes hacer en la VM Dalvik(máquina virtual de Android) que puedes en Sun VM?
que es dalvik y art (4)
Sé que puede ejecutar casi todo Java en la máquina virtual de Dalvik que pueda en la máquina virtual de Java, pero las limitaciones no son muy claras. ¿Alguien ha tropezado con algún obstáculo importante? ¿Alguna biblioteca importante tiene problemas? ¿Algún idioma que compila código de bytes de Java ( Scala , Jython , etc.) no funciona como se esperaba?
Hay una serie de cosas que Dalvik no manejará o no manejará de la misma manera que el bytecode estándar de Java, aunque la mayoría de ellos son bastante avanzados.
El ejemplo más grave es la generación de bytecode en tiempo de ejecución y la carga de clases personalizadas. Digamos que le gustaría crear un bytecode y luego usar el cargador de clases para cargarlo, si ese truco funciona en su máquina normal, se garantiza que no funcionará en Dalvik, a menos que cambie la generación de bytecode.
Eso le impide usar ciertos marcos de inyección de dependencia, el ejemplo más conocido es Google Guice (aunque estoy seguro de que algunas personas trabajan en eso). Por otro lado, AspectJ debería funcionar ya que usa la instrumentación bytecode como un paso de compilación (aunque no sé si alguien lo intentó).
En cuanto a otros lenguajes jvm, cualquier cosa que al final se compile con un bytecode estándar y no use instrumentación bytecode en el tiempo de ejecución se puede convertir a Dalvik y debería funcionar. Sé que la gente sí ejecutó Jython en Android y funcionó bien.
Otra cosa a tener en cuenta es que no existe una compilación justo a tiempo . Esto no es estrictamente un problema de Dalviks (siempre puedes compilar cualquier bytecode sobre la marcha si lo deseas) pero eso no es compatible con Android y es poco probable que lo haga. En el efecto, mientras que la microenmarcación para Java estándar era inútil, los componentes tenían caracteres característicos de tiempo de ejecución diferentes en las pruebas que como parte de sistemas más grandes, las micro marcas para teléfonos Android tienen mucho sentido.
Otra cosa que creo que podría agregarse aquí es que Dalvik aparentemente no conserva el orden de campo cuando lista los campos de una clase usando la API de reflexión. Ahora, la API de reflexión no ofrece garantías de ninguna forma (por lo que, idealmente, no deberías depender de ello de todos modos), pero la mayoría de las otras máquinas virtuales conservan el orden.
Si ve la sesión de Google IO " Dalvik Virtual Machine Internal ", puede encontrar que Dalvik no es compatible con GC generacional .
Por lo tanto, podría degradar el rendimiento de la creación y eliminación frecuente de objetos. Java VM admite el GC generacional, por lo que mostraría un mejor rendimiento del GC para la misma situación.
Y también, Dalvik utiliza JIT de traza-granualidad en lugar de JIT de granualidad de método.
Solo para agregar a la conversación, no para revivir un hilo viejo. Acabo de encontrar esto en mi búsqueda, y quiero agregar que Jython tampoco funciona de la misma manera con Dalvik. Simplemente tratando de hacer un ejemplo de hello world se obtendrá lo siguiente: