Skip to content

Apache JMeter Cheatsheet

Apache JMeter Cheatsheet

Installation

PlatformCommand
Ubuntu/Debiansudo apt update && sudo apt install jmeter
Ubuntu (Snap)sudo snap install jmeter
macOS (Homebrew)brew install jmeter
Windows (Chocolatey)choco install jmeter
Binary (Linux/macOS)wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz && tar -xzf apache-jmeter-5.6.3.tgz
Dockerdocker pull justb4/jmeter:latest
PrerequisitesJava JDK 8+ required: java -version

Post-Installation Setup

# Add JMeter to PATH (Linux/macOS)
export JMETER_HOME=/opt/apache-jmeter-5.6.3
export PATH=$PATH:$JMETER_HOME/bin

# Verify installation
jmeter --version

# Increase heap size (add to ~/.bashrc or jmeter startup script)
export JVM_ARGS="-Xms1g -Xmx4g"

Basic Commands

CommandDescription
jmeterLaunch JMeter GUI
jmeter -t test-plan.jmxOpen specific test plan in GUI
jmeter -n -t test.jmx -l results.jtlRun test in non-GUI mode with results
jmeter -n -t test.jmx -l results.jtl -e -o report/Run test and generate HTML dashboard
jmeter --version or jmeter -vDisplay JMeter version
jmeter --help or jmeter -hShow help and available options
jmeter -?List all available properties
jmeter -n -t test.jmx -j jmeter.logRun test with custom log file
jmeter -g results.jtl -o dashboard/Generate HTML report from existing results
jmeter -p custom.propertiesLaunch with custom properties file
jmeter -Xmx4gLaunch with increased heap size (4GB)
jmeter-serverStart JMeter in server mode for distributed testing
jmeter -n -t test.jmx -l results.csvRun test and save results as CSV
jmeter -n -t test.jmx -l results.xmlRun test and save results as XML
jmeter -Jusers=100Override property value at runtime

Advanced Usage

CommandDescription
jmeter -n -t test.jmx -rRun test on all remote servers
jmeter -n -t test.jmx -R server1:1099,server2:1099Run test on specific remote servers
jmeter -n -t test.jmx -Gusers=100 -Grampup=60Set global properties for remote servers
jmeter -n -t test.jmx -r -XRun distributed test and exit remote servers after
jmeter -n -t test.jmx -q env.properties -q users.propertiesUse multiple property files
jmeter -H proxy.example.com -P 8080Run with HTTP proxy
jmeter -H proxy.com -P 8080 -u username -a passwordRun with authenticated proxy
jmeter -Lorg.apache.jmeter=DEBUGSet log level to DEBUG
jmeter -Lorg.apache.jmeter.protocol.http=DEBUGSet log level for specific package
jmeter-server -Djava.rmi.server.hostname=192.168.1.100Start server with specific hostname
jmeter-server -Dserver_port=1099Start server on custom port
jmeter -n -t test.jmx -Jsummariser.interval=30Set summary interval to 30 seconds
jmeter -n -t test.jmx -Jjmeter.save.saveservice.output_format=xmlForce XML output format
jmeter -n -t test.jmx -Jjmeter.save.saveservice.response_data=trueInclude response data in results
jmeter -XX:+UseG1GC -n -t test.jmxRun with G1 garbage collector
jmeter -Dcom.sun.management.jmxremote -n -t test.jmxEnable JMX monitoring
jmeter -Dhttp.keepAlive=false -n -t test.jmxDisable HTTP keep-alive
jmeter -g results.jtl -o dashboard/ -fForce overwrite existing dashboard
`jmeter -N “localhost*.internal.com”`
PluginsManagerCMD.sh install jpgc-casutg,jpgc-synthesisInstall JMeter plugins via CLI

Configuration

JMeter Properties File (jmeter.properties)

# Thread and ramp-up settings
jmeter.threads=100
jmeter.rampup=60

# Remote server configuration
remote_hosts=server1:1099,server2:1099,server3:1099

# Result file configuration
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=false
jmeter.save.saveservice.samplerData=false
jmeter.save.saveservice.requestHeaders=false
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=false

# HTTP settings
httpclient.reset_state_on_thread_group_iteration=true
http.keepAlive=true
http.connection.timeout=30000
http.socket.timeout=120000

# Summariser interval (seconds)
summariser.interval=30

# Log level
log_level.jmeter=INFO
log_level.jmeter.engine=DEBUG

User Properties File (user.properties)

# Custom variables
baseurl=https://example.com
users=100
rampup=60
duration=300

# Environment-specific settings
env=production
api_key=your_api_key_here

System Properties

# Set system properties via command line
jmeter -Dhttp.proxyHost=proxy.example.com \
       -Dhttp.proxyPort=8080 \
       -Dhttps.proxyHost=proxy.example.com \
       -Dhttps.proxyPort=8080 \
       -n -t test.jmx

JVM Configuration (jmeter script)

# Edit JMETER_HOME/bin/jmeter or set environment variable
export HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m"
export GC_ALGO="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20"
export JVM_ARGS="$HEAP $GC_ALGO"

Distributed Testing Configuration

# In jmeter.properties on controller machine
remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099

# Server RMI configuration
server.rmi.ssl.disable=true
server.rmi.localport=4000
server_port=1099

# On remote server machines
java.rmi.server.hostname=192.168.1.101

Common Use Cases

Use Case 1: Basic Load Test with HTML Report

# Run load test with 100 users, 60s ramp-up, generate HTML report
jmeter -n -t load-test.jmx \
       -Jusers=100 \
       -Jrampup=60 \
       -Jduration=300 \
       -l results/results.jtl \
       -e -o results/dashboard/ \
       -j results/jmeter.log

# View the report
open results/dashboard/index.html  # macOS
xdg-open results/dashboard/index.html  # Linux

Use Case 2: Distributed Load Test Across Multiple Servers

# Step 1: Start JMeter servers on remote machines
# On server1 (192.168.1.101):
jmeter-server -Djava.rmi.server.hostname=192.168.1.101

# On server2 (192.168.1.102):
jmeter-server -Djava.rmi.server.hostname=192.168.1.102

# Step 2: Run distributed test from controller
jmeter -n -t distributed-test.jmx \
       -R 192.168.1.101:1099,192.168.1.102:1099 \
       -Gusers=500 \
       -Grampup=120 \
       -l distributed-results.jtl \
       -e -o distributed-report/

# Step 3: Shutdown remote servers
jmeter -n -t distributed-test.jmx -R 192.168.1.101:1099,192.168.1.102:1099 -X

Use Case 3: API Performance Testing with Multiple Environments

# Create environment-specific property files
# dev.properties:
echo "baseurl=https://dev-api.example.com" > dev.properties
echo "api_key=dev_key_123" >> dev.properties

# prod.properties:
echo "baseurl=https://api.example.com" > prod.properties
echo "api_key=prod_key_456" >> prod.properties

# Run test against dev environment
jmeter -n -t api-test.jmx \
       -q dev.properties \
       -Jusers=50 \
       -l dev-results.jtl \
       -e -o dev-report/

# Run test against production environment
jmeter -n -t api-test.jmx \
       -q prod.properties \
       -Jusers=200 \
       -l prod-results.jtl \
       -e -o prod-report/

Use Case 4: CI/CD Integration (Jenkins/GitLab)

#!/bin/bash
# performance-test.sh - CI/CD pipeline script

# Set variables
TEST_PLAN="test-plans/load-test.jmx"
RESULTS_DIR="results/$(date +%Y%m%d_%H%M%S)"
USERS=${USERS:-100}
DURATION=${DURATION:-300}

# Create results directory
mkdir -p $RESULTS_DIR

# Run JMeter test
jmeter -n -t $TEST_PLAN \
       -Jusers=$USERS \
       -Jduration=$DURATION \
       -l $RESULTS_DIR/results.jtl \
       -e -o $RESULTS_DIR/dashboard/ \
       -j $RESULTS_DIR/jmeter.log

# Check for errors (exit code)
if [ $? -eq 0 ]; then
    echo "Test completed successfully"
    
    # Archive results
    tar -czf $RESULTS_DIR.tar.gz $RESULTS_DIR
    
    # Optional: Upload to artifact storage
    # aws s3 cp $RESULTS_DIR.tar.gz s3://bucket/results/
else
    echo "Test failed with errors"
    exit 1
fi

Use Case 5: Database Performance Testing

# Test database performance with parameterized queries
jmeter -n -t database-test.jmx \
       -Jdb.host=db.example.com \
       -Jdb.port=5432 \
       -Jdb.name=testdb \
       -Jdb.user=testuser \
       -Jdb.password=testpass \
       -Jthreads=50 \
       -Jrampup=30 \
       -l db-results.jtl \
       -e -o db-report/

# Generate report from existing results
jmeter -g db-results.jtl -o db-report-regenerated/

Best Practices

  • Always use non-GUI mode for actual testing: GUI mode consumes significant resources and affects test accuracy. Use jmeter -n for all performance tests.

  • Allocate sufficient heap memory: Set JVM heap size to at least 25% of available RAM. For large tests: export JVM_ARGS="-Xms2g -Xmx4g -XX:+UseG1GC"

  • Use CSV format for result files: CSV format is more efficient than XML. Disable unnecessary data collection to reduce overhead: jmeter.save.saveservice.response_data=false

  • Implement proper ramp-up periods: Avoid starting all threads simultaneously. Use gradual ramp-up (typically 10-20% of test duration) to simulate realistic load patterns.

  • Leverage distributed testing for high loads: Single machine limitations can skew results. Use multiple JMeter servers for tests exceeding 500-1000 threads.

  • Parameterize test data: Use CSV Data Set Config or variables instead of hardcoded values. This enables easy test configuration and environment switching.

  • Monitor system resources during tests: Track CPU, memory, network, and disk I/O on both JMeter machines and target systems. High resource usage on JMeter indicates bottlenecks in test execution.

  • Version control test plans: Store .jmx files and property files in Git. Use meaningful commit messages and tag releases for reproducibility.

  • Implement proper correlation and assertions: Extract dynamic values (tokens, session IDs) and validate responses. Don’t just measure speed—verify correctness.

  • Clean up between test runs: Clear results directories and logs. Reset application state when needed to ensure consistent test conditions.

Troubleshooting

IssueSolution
OutOfMemoryError during testIncrease heap size: export JVM_ARGS="-Xms2g -Xmx4g" or reduce threads/disable response data saving
Connection refused on remote serversCheck firewall rules for ports 1099 and 4000. Verify java.rmi.server.hostname is set correctly on server
Test results show 100% errorsVerify target URL is accessible, check proxy settings, review jmeter.log for detailed error messages
GUI freezes during large testsNever run large tests in GUI mode. Use non-GUI: jmeter -n -t test.jmx -l results.jtl
Inconsistent results between runsEnsure proper ramp-up, clear cache/cookies between runs, verify network stability, check target system load
Cannot generate HTML reportVerify results file format is compatible (CSV/JTL), ensure output directory is empty or use -f flag to force overwrite
Remote servers not startingCheck Java version compatibility (JDK 8+), verify RMI registry port is available, review jmeter-server.log
SSL/TLS certificate errorsAdd certificate to Java keystore or disable validation: jmeter -Jhttps.default.protocol=TLSv1.2
Slow test executionDisable listeners in non-GUI mode, reduce assertion complexity, optimize regular expressions, use efficient extractors
”Non HTTP response code: java.net.SocketException”Increase timeout values, check connection pool settings, verify target system capacity, reduce thread count
Distributed test results incompleteEnsure all servers have same test plan version, check network connectivity, verify clock synchronization across servers
High CPU on JMeter machineReduce thread count, disable unnecessary processors/listeners, use simpler samplers, consider distributed testing
Cannot install pluginsDownload Plugins Manager JAR manually to lib/ext/, ensure internet connectivity, check proxy settings
Results file corrupted or emptyEnsure sufficient disk space, check file permissions, verify JMeter process completed successfully
”Address already in use” errorChange server port: jmeter-server -Dserver_port=1100, kill existing JMeter processes, wait for port release

Quick Reference: Command Line Options

OptionDescriptionExample
-nNon-GUI modejmeter -n -t test.jmx
-tTest plan filejmeter -t mytest.jmx
-lResults log filejmeter -n -t test.jmx -l results.jtl
-jJMeter log filejmeter -n -t test.jmx -j jmeter.log
-rRun on all remote serversjmeter -n -t test.jmx -r
-RRun on specific serversjmeter -n -t test.jmx -R server1,server2
-gGenerate report from filejmeter -g results.jtl -o report/
-eGenerate report after testjmeter -n -t test.jmx -l results.jtl -e -o report/
-oOutput folder for reportjmeter -g results.jtl -o dashboard/
-HProxy hostjmeter -H proxy.com -P 8080
-PProxy portjmeter -H proxy.com -P 8080
-uProxy usernamejmeter -H proxy.com -P 8080 -u user
-aProxy passwordjmeter -H proxy.com -P 8080 -a pass
-JDefine JMeter propertyjmeter -Jusers=100 -Jrampup=60
-GDefine global propertyjmeter -Gusers=100 (for remote servers)
-DDefine system propertyjmeter -Dhttp.proxyHost=proxy.com
-LSet log leveljmeter -Lorg.apache.jmeter=DEBUG
-pProperty filejmeter -p custom.properties
-qAdditional property filejmeter -q env.properties
-XExit remote serversjmeter -n -t test.jmx -r -X
-fForce delete output folderjmeter -g results.jtl -o report/ -f