Performance of Performance Testing: JMeter Script Optimization with VisualVM

Backer posted Originally published at bugnificent.medium.com 3 min read

Performance testing is critical to ensuring that applications can handle load and stress under realistic usage scenarios. However, the performance of the performance testing tool and scripts themselves is equally important. Poorly optimized JMeter scripts can lead to misleading results, increased hardware costs, and inefficient test cycles.

Below are actionable tips to maximize JMeter efficiency, with real-world pitfalls to avoid.

Apache JMeter


Why Optimize JMeter Scripts?

  • Faster Test Execution: Inefficient scripts consume more CPU and memory.
  • Scalability: Optimized scripts allow simulating more users with less infrastructure.
  • Cost-effective: Cloud-based testing becomes cheaper.
  • Realistic Results: Avoid misleading bottlenecks introduced by your test scripts.

1. Use CSV Data Sets Efficiently

Use CSV Data Set Config wisely. Common mistakes include:

  • Using large CSVs unnecessarily.
  • Not enabling Recycle on EOF? or Stop thread on EOF? options correctly.

Tip: Keep only relevant data and enable sharing mode if multiple threads access the file.


2. Reduce Unnecessary Assertions

While assertions validate response data, too many of them slow down test execution. Prefer:

Response Assertion → Contains → 200 OK

over using overly complex regex or JSON assertions when not required.


3. Avoid Heavy Listeners During Execution

GUI listeners like View Results Tree and Summary Report are resource-heavy.

Tip: Use Simple Data Writer or log results in .jtl file. Analyze after test completion using GUI.


4. Efficient Scripting with Logic Controllers

Use If Controller, While Controller, and Throughput Controller carefully.

Bad: Nesting multiple logic controllers unnecessarily.

Better: Flatten the structure, keep logic clear and concise.


5. Use JMeter Functions Wisely

Overusing built-in functions like __groovy, __BeanShell, and heavy JS logic increases CPU usage.

Tip: Prefer __UUID, __time, and simple functions.
Avoid using BeanShell during test runs—replace with pre-compiled JSR223 (Groovy).


6. Enable Delays via Timers Judiciously

Timers help simulate realistic pacing but overuse causes artificial bottlenecks.

Good Practice: Use Constant Throughput Timer only when necessary and calibrate delay properly.


7. Thread Management & Ramp-Up Strategy

Unrealistic ramp-up times overwhelm servers and JMeter itself.

Tip: For 100 users, prefer a ramp-up of 100 seconds (1 user/sec) or based on your backend readiness.
Use Ultimate Thread Group or Concurrency Thread Group for better flexibility.


8. Parameterization and Reusability

Avoid hardcoding values. Externalize them using:

  • CSV files
  • Properties file (user.properties, jmeter.properties)
  • Environment variables

Tip: Modularize your test plan by creating reusable fragments.


9. Server-Side Monitoring Integration

Sometimes the bottleneck isn't in the script but in the backend. Use tools like:

  • InfluxDB + Grafana
  • Prometheus
  • New Relic / Dynatrace

Tip: Correlate JMeter results with server metrics to gain insights.


10. Run in Non-GUI Mode

Never run tests in GUI mode.

Use:

jmeter -n -t testplan.jmx -l results.jtl -e -o /output/folder

GUI is only for debugging and building test plans.


Bonus Tip: Monitor Slave Machines with VisualVM

When running distributed JMeter tests, it’s crucial to monitor the health of your slave machines (e.g., CPU, RAM, threads) to ensure they aren’t becoming bottlenecks. VisualVM is a free, powerful tool for real-time monitoring and profiling.

VisualVM

Steps to Use VisualVM:

  • Install VisualVM: Download it from visualvm.github.io.
  • Connect to JMeter Slaves: Run VisualVM and connect to your JMeter slave machines with
    Remote Host section. Then run your .JMX (Java Management Extensions)preferably on Non-GUI.
  • Monitor in Real-Time: Track CPU, memory, threads, and garbage collection to identify resource bottlenecks.
  • Capture Snapshots: Take snapshots of performance data (e.g., .nps files) or generate visual graphs (e.g., .png files) for detailed analysis.

Why It’s Useful:

  • Identify bottlenecks: Detect if a slave machine is maxing out CPU or memory.
  • Debug performance issues: Analyze thread dumps or heap usage during test execution.
  • Create reports: Use .nps or .png files for post-test analysis or stakeholder presentations.
  • Common Mistake: Ignoring slave machine health, leading to skewed test results or crashes under high load.

Key Takeaways:

  • Less is more: Trim listeners, logging, and assertions.
  • Simulate reality: Use timers and avoid thread group sprawl.
  • Optimize early: Test scripting is as critical as test execution.
  • Monitor your machines: Reduce the burden on your DevOps.

Conclusion

Optimizing JMeter scripts is an often overlooked but essential part of performance testing. Efficient scripts reduce costs, improve accuracy, and help you reach the true performance limits of your system under test.

Start small, test often, and iterate on your script performance as you would for the application itself.


Happy Testing!

If you read this far, tweet to the author to show them you care. Tweet a Thanks

The article outlines ten practical ways to optimize JMeter performance like disabling listeners, using timers, switching to Groovy, and leveraging CLI mode to ensure realistic, scalable load tests. It also highlights using VisualVM for real‑time monitoring of slave machines during distributed testing to catch resource bottlenecks early.

More Posts

Writing Your First Interactive Bash Script (With User Input)

Gift Balogun - Jul 4

3 Pillars of Testing: How to be a good tester?

bugnificent - Apr 7

Tester's Six Eye Technique: Visual Regression Testing

bugnificent - May 2

How to Achieve Automated Testing Within Sprint?

Shivam Bharadwaj - Feb 6

How to use Builder design Pattern for test data generation in automation testing

Faisal khatri - Oct 14, 2024
chevron_left