¿Cuáles son los criterios que utiliza la máquina virtual dalvik de Android para la compilación JIT?

Nota: hablaré de la versión de código abierto de Dalvik. La gente podría haber modificado Dalvik localmente.

TLDR: tabla hash que cuenta la cantidad de veces que se ve un contador de programa.

Entonces, la versión actual de código abierto de Dalvik compila el código en unidades de rastreo, donde un rastreo es una secuencia lineal de ejecución del programa. Por ejemplo, el comienzo de un método, hasta que la primera instrucción de ramificación (un inicio de un ciclo, una declaración if, un interruptor, etc.) forma un rastro.

Solo hay tantos inicios posibles de una traza. Puede ser el comienzo de un método, el comienzo de una declaración if, el comienzo de un caso de cambio, una etiqueta a la que salta un goto, etc.

Los programas Java se convierten en bytecodes. Cada una de estas posibilidades de inicio de rastreo corresponde a bytecodes particulares. Entonces, el comienzo de un método se señala mediante bytecodes “invocar”, sentencias if por “if” bytecodes, goto by (lo adivinó) “goto” bytecodes, etc.

Mientras ejecuta cada uno de estos códigos de bytes, el intérprete de Dalvik realiza una llamada rápida a una pequeña rutina que controla el contador del programa actual e incrementa el valor en la tabla hash. Entonces, ahora, si golpea mucho una instrucción if particular, el intérprete incrementará repetidamente el valor de esta ubicación en el programa en la tabla hash.

Eventualmente cruzará un valor de umbral (generalmente está en cientos), y en ese momento Dalvik sabrá que debe compilar esta traza. Se procederá a formar el seguimiento y enviarlo al compilador.

Si realmente quiere ensuciarse las manos, aquí está el código que actualiza la tabla hash:
platform_dalvik

Observe las llamadas a common_updateProfile en todo el archivo. Todos intentan actualizar el valor de la tabla hash de los contadores de programa respectivos.