¿Cómo se implementan las interfaces Java internamente? (vtables?)

C ++ tiene herencia múltiple. La implementación de la herencia múltiple a nivel de ensamblado puede ser bastante complicada, pero hay buenasdescripciones en línea sobre cómo se hace esto normalmente (vtables, reparaciones de puntero, thunks, etc.).

Java no tiene herencia de implementación múltiple, pero sí tiene herencia de interfaz múltiple, por lo que no creo que una implementación directa con una única tabla v por clase pueda implementar eso. ¿Cómo implementa Java las interfaces internamente?

Me doy cuenta de que, a diferencia de C ++, Java está compilado en Jit, por lo que diferentes piezas de código pueden optimizarse de manera diferente, y diferentes JVM pueden hacer las cosas de manera diferente. Entonces, ¿hay alguna estrategia general que sigan muchas JVM sobre esto, o alguien conoce la implementación en una JVM específica?

Además, las JVM a menudo desvirtualizan y llaman a métodos en línea, en cuyo caso no hay vtables o equivalentes involucrados en absoluto, por lo que podría no tener sentido preguntar sobre secuencias de ensamblaje reales que implementan llamadas a métodos virtuales / de interfaz, pero supongo que la mayoría de las JVM aún conservan algunas tipo de representación general de clases para usar si no han podido desvirtualizar todo. ¿Es incorrecta esta suposición? ¿Esta representación se parece de alguna manera a una tabla de C ++ vtable? Si es así, ¿las interfaces tienen vtables separadas y cómo se vinculan con las vtables de clase? Si es así, ¿pueden las instancias de objeto tener múltiples punteros vtable (a clases / interfaces vtables) como las instancias de objeto en C ++ can? ¿Las referencias de un tipo de clase y un tipo de interfaz al mismo objeto siempre tienen el mismo valor binario o pueden diferir como en C ++, donde requieren reparaciones de puntero?

(para referencia:esta pregunta pregunta algo similar sobre el CLR, y parece haber una buena explicación eneste artículo msdn aunque eso puede estar desactualizado por ahora. No he podido encontrar nada similar para Java).

Editar:

Me refiero a 'implementa' en el sentido de "¿Cómo implementa el compilador GCC la suma de enteros / llamadas de función / etc", no en el sentido de "Java Class ArrayList implementa la interfaz de Lista"Soy consciente de cómo funciona esto en el nivel de bytecode de JVM, lo que quiero saber es qué tipo de código y estructuras de datos genera la JVM después de cargar los archivos de clase y compilar el bytecode.

Respuestas a la pregunta(1)

Su respuesta a la pregunta