Initialization of @Param's in nested @State classes

Aleksey Shipilev aleksey.shipilev at oracle.com
Sat Nov 15 15:19:32 UTC 2014


Thanks, so recorded:
 https://bugs.openjdk.java.net/browse/CODETOOLS-7901105

-Aleksey.

On 11/15/2014 06:13 PM, Gleb Smirnov wrote:
> Hi All,
> 
> Given the following test case:
>  
> public class NestedStateBenchmark {
>  
>     @State(Scope.Benchmark)
>     public static class NestedState {
>         @Param({"0", "1"})
>         public int foo;
>     }
>  
>     @State(Scope.Thread)
>     public static class OuterState {
>         public int bar;
>  
>         @Setup
>         public void setup(NestedState nestedState) {
>             this.bar = -nestedState.foo;
>         }
>     }
>  
>     @Benchmark
>     public int measure(OuterState state) {
>         return state.bar;
>     }
> }
> 
> One would expect the `measure` method to be returning 0 or 1, with
> respect to
> the param `foo`.
> 
> However, what actually happens is the benchmark crashing with the following
> exception:
> 
> java.lang.IllegalStateException: The value for the parameter "foo" is
> not set.
>         at
> org.openjdk.jmh.runner.InfraControlL2.getParam(InfraControl.java:190)
>         at
> org.openjdk.jmh.runner.InfraControl.getParam(InfraControl.java:39)
>         at
> generated.NestedStateBenchmark_measure._jmh_tryInit_f_nestedstate3_G(NestedStateBenchmark_measure.java:331)
>         at
> generated.NestedStateBenchmark_measure.measure_Throughput(NestedStateBenchmark_measure.java:57)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>         at java.lang.reflect.Method.invoke(Unknown Source)
>         at
> org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:199)
>         at
> org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:181)
>         at java.util.concurrent.FutureTask.run(Unknown Source)
>         at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
>         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
> Source)
>         at java.lang.Thread.run(Unknown Source)
> 
> This is a bug, a person familiar with the matter said
> (https://twitter.com/shipilev/status/533565238407618560)
> 
> Reproducible with JMH 1.3.




More information about the jmh-dev mailing list