Slow performance of StackWalker.getCallerClass() vs Reflection.getCallerClass()

Mandy Chung mandy.chung at oracle.com
Tue Jul 2 17:48:18 UTC 2019


MethodHandles::lookup is optimized (@ForceInline) and so it may not
represent apple-to-apple comparison.StackWalker::getCallerClass
does have overhead compared to Reflection::getCallerClass and
need to get the microbenchmark in the jdk repo and rerun the numbers [1].

I'm not getting how getCallerClass is used and related to access check.
Can you elaborate?

Mandy
[1] https://bugs.openjdk.java.net/browse/JDK-8221623


On 7/2/19 6:07 AM, Kasper Nielsen wrote:
> Hi Remi,
>
> Yes, setting up a StackWalker is more or less free. It is just
> wrapping a set of options.
>
> public class StackWalkerPerf {
>
>      static final StackWalker sw =
> StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
>
>      @Benchmark
>      public StackWalker stackWalkerSetup() {
>          return StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE);
>      }
>
>      @Benchmark
>      public Class<?> stackWalkerCallerClass() {
>          return sw.getCallerClass();
>      }
>
>      @Benchmark
>      public Lookup reflectionCallerClass() {
>          return MethodHandles.lookup();
>      }
> }
>
> Benchmark                               Mode  Cnt     Score    Error  Units
> StackWalkerPerf.stackWalkerSetup        avgt   10    11.958 ±  0.353  ns/op
> StackWalkerPerf.reflectionCallerClass   avgt   10     8.511 ±  0.415  ns/op
> StackWalkerPerf.stackWalkerCallerClass  avgt   10  1269.825 ± 66.471  ns/op
>
> I'm using MethodHandles.lookup() in this test because it is cheapest
> way to invoke Reflection.getCallerClass() without any tricks.
> So real performance is likely better.
>
> /Kasper
>
> On Tue, 2 Jul 2019 at 13:53, Remi Forax <forax at univ-mlv.fr> wrote:
>> Hi Kasper,
>> did you store the StackWalker instance in a static final field ?
>>
>> Rémi
>>
>> ----- Mail original -----
>>> De: "Kasper Nielsen" <kasperni at gmail.com>
>>> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
>>> Envoyé: Mardi 2 Juillet 2019 11:09:11
>>> Objet: Slow performance of StackWalker.getCallerClass() vs Reflection.getCallerClass()
>>> Hi,
>>>
>>> Are there any security reasons for why StackWalker.getCallerClass()
>>> cannot be made as performant as Reflection.getCallerClass()?
>>> StackWalker.getCallerClass() is at least 100 times slower then
>>> Reflection.getCallerClass() (~1000 ns/op vs ~10 ns/op).
>>>
>>> I'm trying to retrofit some existing APIs where I cannot take a Lookup
>>> object to do some access control checks.
>>> But the performance of StackWalker.getCallerClass() is making it impossible.
>>>
>>> Best
>>>   Kasper



More information about the core-libs-dev mailing list