...
The first time a clean call site is invoked the JVM looks at the type of the receiver and looks up the method that would be invoked. Because the call site is clean the CompiledIC assumes that the type of the current receiver is a good guess for the future type, so it points the call at the unverified entry point of the method. This is a special entry point with an inline cache check that verifies that the current receiver matches the receiver recorded in the call site. If it does then it continues into the verfified entry point and executes the method. If the method being invoked has compiled code then the inline cache check is part of the nmethod and looks roughly like this:
cmp reg, \ [receiver_reg + klass_offset\]
Wiki Markup
jne SharedRuntime::get_ic_miss_stub()
The value in receiver_reg is the klassOop of the original receiver and the compare is a quick type equality check to ensure that the method is compatible with the current type.
...