Hi Wenei, The idea of bindTo()/insertArguments is that you are requesting a partial evaluation, so you are asking the VM/JIT to specialize the method handle if the method handle is used often. So compiling a method handle to a bytecode snippet in that case is the expected behavior, not a bug.
What i do not understand is why you need to have a different method handle for each row ? Did you try to use invokeWithArguments instead of bindTo().invokeExact() ? cheers, Rémi > De: "Wenlei Xie" <wenlei....@gmail.com> > À: mlvm-dev@openjdk.java.net > Envoyé: Mardi 2 Mai 2017 21:29:38 > Objet: Implementing Lambda with Capture support makes Metaspace fills > LambdaForms$BMH class > Hi, > We are implementing Lambda function with capture support in a SQL Engine. We > currently implement by compiling user-written Lambda Expression into a > MethodHandle. And use bindTo to captured fields. Thus for each row we will > have > a Bound Method Handle. > However, we found JVM will generate the byte code Bound Method Handle once > it's > invoked more than 128 times. This cause in some cases (when the table has > large > arrays), the Metaspace fills with generated LambdaForm$BMH class. > Here is the simple code to reproduce the issue: > https://github.com/wenleix/BMHTest . It looks we cannot increase > java.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD beyond 128. Any suggestions > to implement Lambda with Capture Support on JVM? > Thank you !! > Best, > Wenlei > _______________________________________________ > mlvm-dev mailing list > mlvm-dev@openjdk.java.net > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev