14

I have some JMH benchmarks that I'm trying to analyze. I want to enable GC logging to see how much garbage is being generated, but I can't figure out how to pass JVM arguments. I know JMH runs benchmarks in a forked JVM, so it's not immediately obvious to me how to do this. I'm using SBT.

1
  • JMH passes any arguments passed to it. You can just add them to the command line, Commented Mar 30, 2016 at 8:06

2 Answers 2

17

If I read sbt-jmh docs right, it passes the application options to JMH runner with jmh:run .... So, having that JMH command line accepts --jvmArgs "...", I would try to do jmh:run --jvmArgs "-XX:+PrintGCDetails". Or, as @apangin mentions, add @Fork(jvmArgsAppend = "-XX:+PrintGCDetails").

But for your particular use case -- "see how much garbage is generated" -- it might be even better idea to use a bundled GC profiler, activated with -prof gc. See the example at JMHSample_35_Profilers.java#l71.

Sign up to request clarification or add additional context in comments.

Comments

16

Use @Fork annotation:

@Benchmark
@Fork(jvmArgsAppend = "-XX:+PrintGCDetails")
public void someBenchmark() {
    ...
}

Note that JVM arguments passed to JMH are also propagated to forked benchmarks.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.