¿Qué no puede hacer en la VM de Dalvik (VM de Android) que puede hacer en la VM de Sun?

StackOverflow https://stackoverflow.com/questions/230193

  •  04-07-2019
  •  | 
  •  

Pregunta

Sé que puede ejecutar casi todo Java en Dalvik's VM que puede hacerlo en Java's VM pero las limitaciones no son muy claras. ¿Alguien se ha topado con algún obstáculo importante? ¿Alguna biblioteca importante tiene problemas? ¿Cualquier idioma que se compile en el código de bytes de Java ( Scala , Jython , etc.) no funciona como se esperaba?

¿Fue útil?

Solución

Hay una serie de cosas que Dalvik no manejará o no manejará de la misma manera que el código de bytes estándar de Java, aunque la mayoría de ellas son bastante avanzadas.

El ejemplo más grave es la generación de bytecode en tiempo de ejecución y la carga de clases personalizada. Digamos que le gustaría crear un código de bytes y luego usar el cargador de clases para cargarlo por usted, si ese truco funciona en su máquina normal, se garantiza que no funcionará en Dalvik, a menos que cambie su generación de código de bytes.

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 utiliza la instrumentación de bytecode como paso de compilación (aunque no sé si alguien lo intentó).

En cuanto a otros lenguajes jvm, todo lo que al final se compila en bytecode estándar y no utiliza instrumentación de bytecode en tiempo de ejecución se puede convertir a Dalvik y debería funcionar. Sé que la gente ejecutó Jython en Android y funcionó bien.

Otra cosa a tener en cuenta es que no hay compilación justo a tiempo . Este no es estrictamente un problema de Dalviks (siempre puede compilar cualquier bytecode sobre la marcha si lo desea), pero ese Android no lo admite y es poco probable que lo haga. En efecto, si bien la microbenchmarking para Java estándar era inútil: los componentes tenían diferentes características de tiempo de ejecución en las pruebas que como partes de sistemas más grandes, las microbenchmarks para teléfonos Android tienen mucho sentido.

Otros consejos

Si ve " Internas de la máquina virtual Dalvik " En la sesión de IO de Google, puede encontrar que Dalvik no admite GC generacional .

Por lo tanto, podría degradar el rendimiento de la frecuente creación y eliminación de objetos. Java VM es compatible con GC generacional, por lo que mostraría un mejor rendimiento de GC para la misma situación.

Y también, Dalvik usa trace-granuality JIT en lugar de JIT de granualidad de método.

Otra cosa que supongo que podría agregarse aquí es que Dalvik aparentemente no conserva el orden de los campos al enumerar los campos de una clase utilizando la API de reflexión. Ahora, la API de reflexión no ofrece ninguna garantía al respecto (de modo que lo ideal sería que no dependiera de ella de todos modos), pero la mayoría de las otras máquinas virtuales que hay por ahí do conservan el orden.

Solo para agregar a la conversación, no está destinado a revivir un hilo viejo. Acabo de encontrar esto en mi búsqueda, y quiero agregar que Jython tampoco funciona con Dalvik. Simplemente intentar hacer un ejemplo de "hola mundo" dará como resultado lo siguiente:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top