public class HelloLambda { public static void main(String[] args) throws Throwable { doit(() -> { System.out.println("Hello Lambda"); Thread.dumpStack(); }); } static void doit(Runnable r) { r.run(); } } ********************************************************************** $ mkdir -p DUMP_CLASS_FILES; java -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true \ -Djdk.internal.lambda.dumpProxyClasses=DUMP_CLASS_FILES \ -Djava.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE=true \ -XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames \ -cp ~/tmp HelloLambda Dumping class files to DUMP_CLASS_FILES/... linkCallSite HelloLambda.main(HelloLambda.java:17) java.lang.invoke.LambdaMetafactory.metafactory(Lookup,String,MethodType,MethodType,MethodHandle,MethodType)CallSite/invokeStatic run()Runnable/BSA=[()void, MethodHandle()void, ()void] linkMethod java.lang.invoke.MethodHandle.invokeExact(Lookup,String,MethodType,MethodType,MethodHandle,MethodType)CallSite/5 linkMethod => java.lang.invoke.Invokers$Holder.invokeExact_MT(Object,Object,Object,Object,Object,Object,Object,Object)Object/invokeStatic + (Lookup,String,MethodType,MethodType,MethodHandle,MethodType)CallSite linkCallSite java.base/java.security.Security.(Security.java:82) java.lang.invoke.LambdaMetafactory.metafactory(Lookup,String,MethodType,MethodType,MethodHandle,MethodType)CallSite/invokeStatic run()PrivilegedAction/BSA=[()Object, MethodHandle()Object, ()Object] linkMethod java.lang.invoke.MethodHandle.invokeExact()Object/5 linkMethod => java.lang.invoke.Invokers$Holder.invokeExact_MT(Object,Object)Object/invokeStatic + ()Object dump: DUMP_CLASS_FILES/java/lang/invoke/LambdaForm$MH000.class linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_L linkCallSite target => ()PrivilegedAction : invoke000_L_L=Lambda(a0:L/SpeciesData[L => Species_L])=>{ t1:L=Species_L.argL0(a0:L);t1:L} & BMH=[ 0: ( java.security.Security$$Lambda$7/0x80000000b@659e0bfd ) ] linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object)Object/invokeStatic + MethodHandle()PrivilegedAction linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_L linkCallSite target => ()Runnable : invoke000_L_L=Lambda(a0:L/SpeciesData[L => Species_L])=>{ t1:L=Species_L.argL0(a0:L);t1:L} & BMH=[ 0: ( HelloLambda$$Lambda$2/0x00000008010009f8@6f94fa3e ) ] linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object)Object/invokeStatic + MethodHandle()Runnable Hello Lambda java.lang.Exception: Stack trace at java.base/java.lang.Thread.dumpStack(Thread.java:2201) at HelloLambda.lambda$main$0(HelloLambda.java:19) at HelloLambda$$Lambda$2/0x00000008010009f8.run(Unknown Source) at HelloLambda.doit(HelloLambda.java:24) at HelloLambda.main(HelloLambda.java:17) ********************************************************************** $ javap -c 'DUMP_CLASS_FILES/HelloLambda$$Lambda$7.class' final class HelloLambda$$Lambda$7 implements java.lang.Runnable { public void run(); Code: 0: invokestatic #16 // Method HelloLambda.lambda$main$0:()V 3: return } ********************************************************************** NOTE: the dump indicates that the target of the CallSite a BoundMethodHandle$Species_L, which is a subclass of BoundMethodHandle: ======== CallSite: HelloLambda.main(HelloLambda.java:17) target class = java.lang.invoke.BoundMethodHandle$Species_L target = ()Runnable : invoke000_L_L=Lambda(a0:L/SpeciesData[L => Species_L])=>{ t1:L=Species_L.argL0(a0:L);t1:L} & BMH=[ 0: ( HelloLambda$$Lambda$7/0x00000008010009f8@7440e464 ) ] $ javap 'java.lang.invoke.BoundMethodHandle$Species_L' Compiled from "BoundMethodHandle.java" final class java.lang.invoke.BoundMethodHandle$Species_L extends java.lang.invoke.BoundMethodHandle { final java.lang.Object argL0; [...snip....] } ********************************************************************** To understand how this MH is invoked, repeat the above "java" command in a fastdebug build with the -XX:+TraceBytecodes flag, and find the following in the output: static jobject java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(jobject, jobject, jobject, jobject, jobject, jobject) 2213854 32 areturn static jobject java.lang.invoke.MethodHandleNatives.linkCallSite(jobject, jobject, jobject, jobject, jobject, jobject) 2213855 48 areturn static jobject java.lang.invoke.Invokers$Holder.linkToTargetMethod(jobject) 2213856 0 fast_aload_0 2213857 1 checkcast 12 2213858 4 invokehandle 56 static jobject java.lang.invoke.LambdaForm$MH000/0x0000000800000400.invoke000_L_L(jobject) 2213859 0 fast_aload_0 2213860 1 checkcast 12 2213861 4 fast_agetfield 16 2213862 7 areturn static jobject java.lang.invoke.Invokers$Holder.linkToTargetMethod(jobject) 2213863 7 areturn static void HelloLambda.main(jobject) 2213864 5 invokestatic 11 static void HelloLambda.doit(jobject) 2213865 0 aload_0 2213866 1 invokeinterface 17 After the CallSite is linked, it's invoked with invoke000_L_L(target), which returns target.argL0, which is an instance of HelloLambda$$Lambda$7, whose implementation of the interface method Runnable.run() calls HelloLambda.lambda$main$0:(), which is the body of the Lambda expression in HelloLambda.java