Como as interfaces java são implementadas internamente? (vtables?)

C ++ tem herança múltipla. A implementação de herança múltipla no nível da montagem pode ser bastante complicada, mas há boasdescrições on-line sobre como isso é feito normalmente (vtables, correções de ponteiros, thunks etc.).

O Java não possui herança de implementação múltipla, mas possui herança de interface múltipla, portanto, não acho que uma implementação direta com uma única tabela de tabelas por classe possa implementar isso. Como o java implementa interfaces internamente?

Percebo que, ao contrário do C ++, o Java é compilado com Jit; portanto, diferentes partes do código podem ser otimizadas de maneira diferente, e JVMs diferentes podem fazer as coisas de maneira diferente. Portanto, existe alguma estratégia geral que muitas JVMs seguem sobre isso ou alguém conhece a implementação em uma JVM específica?

Além disso, as JVMs frequentemente destirtualizam e chamam métodos de linha. Nesse caso, não há vtables ou equivalente envolvido; portanto, pode não fazer sentido perguntar sobre sequências de montagem reais que implementam chamadas de método de interface / virtual, mas presumo que a maioria das JVMs ainda mantém algumas tipo de representação geral das classes a serem usadas, caso não tenham sido capazes de destirtualizar tudo. Esta suposição está errada? Essa representação se parece com uma tabela de C ++? Em caso afirmativo, as interfaces possuem vtables separadas e como elas estão vinculadas à classe vtables? Em caso afirmativo, as instâncias de objetos podem ter vários ponteiros vtable (para classe / interface vtables), como as instâncias de objetos em C ++ podem? As referências de um tipo de classe e de interface para o mesmo objeto sempre têm o mesmo valor binário ou podem diferir como no C ++, onde exigem reparos de ponteiro?

(para referência:essa questão pergunta algo semelhante sobre o CLR e parece haver uma boa explicação emeste artigo msdn embora isso possa estar desatualizado até agora. Não consegui encontrar nada semelhante para Java.)

Editar:

Quero dizer 'implementa' no sentido de "Como o compilador GCC implementa adição de número inteiro / chamadas de função / etc", não no sentido de "A classe Java ArrayList implementa a interface List".Estou ciente de como isso funciona no nível de bytecode da JVM, o que eu quero saber é que tipo de código e estruturas de dados são gerados pela JVM após o carregamento dos arquivos de classe e a compilação do bytecode.

questionAnswers(1)

yourAnswerToTheQuestion