Chapter 02Lesson 01~105 minutes

JMeter Architecture, Java Setup, Installation, and First Test Plan: Core Concepts and Mental Model

Chapter 01 defined what a valid performance experiment must prove. This lesson now maps that evidence contract onto the actual JMeter runtime: Java, the JMeter distribution, launchers, JVM process, JMX tree, engine, worker threads, samplers, target, raw results, engine logs, and dashboard artifacts.

Java runtimeJMeter engineJMXCLI modeArtifacts

Learning objectives

  • Trace JMeter execution from Java discovery through the launcher, JVM, engine, thread group, sampler, target, and result artifacts.
  • Separate GUI authoring/debug state from CLI load-execution state.
  • Explain what a JMX file contains and what it does not contain.
  • Distinguish JTL sample data, jmeter.log engine diagnostics, and HTML dashboard output.
  • Inspect Java/JMeter identity and installation paths without changing them.
  • Connect version/path provenance to reproducible DevOps evidence.

1. From workload intent to an executable engine

Executable chapter boundary: whenever this chapter generates HTTP traffic, the mandatory target is the disposable loopback fixture at http://127.0.0.1:8000. Conceptual architecture discussion does not authorize traffic to any public or production system.

Chapter 01 established a chain: business question → workload hypothesis → controlled load → observed target behavior → generator/SUT evidence → validity judgment. JMeter participates in the middle of that chain. It does not decide the business question and it does not automatically prove capacity. Its job is to execute a configured test plan, generate protocol activity, and record client-side evidence.

A reproducible JMeter run therefore needs more than test.jmx. You must know which Java runtime launched the process, which JMeter release interpreted the JMX, which properties/data were supplied, which target was authorized, which mode was used, and where the raw artifacts were written.

2. Mental model: Java to JMeter engine to evidence

JMeter runtime and artifact flow

Read the arrows as ownership and execution/evidence flow. Each node is explained in the prose immediately below the diagram.

flowchart TD
J[Installed Java runtime] --> D[JMeter binary distribution]
D --> L[Launcher: jmeter / jmeter.bat]
L --> P[JVM process]
P --> M[GUI authoring or CLI execution mode]
M --> X[JMX test tree]
X --> E[JMeter engine]
E --> T[Worker thread(s)]
T --> C[Scoped components]
C --> S[Sampler / protocol client]
S --> A[Authorized target]
A --> R[Sample result]
R --> JTL[JTL result file]
P --> LOG[jmeter.log]
JTL --> H[HTML dashboard]

Java runtime executes the JMeter bytecode. The JMeter distribution is the unpacked Apache release containing launch scripts, libraries, properties, documentation, and related files. The launcher chooses and starts Java with JMeter's classpath and JVM options. That creates one JVM process containing the JMeter engine.

The GUI is an authoring and bounded-debugging surface around the same underlying test-plan model. The JMX file is the serialized test tree. During CLI execution the engine creates worker threads according to the Thread Group and invokes scoped components such as samplers. A sampler performs a protocol action and produces a sample result. JTL and jmeter.log preserve different evidence, and an HTML dashboard is generated from sample data after or at the end of a load run.

3. Do not collapse these objects into “JMeter”

Object / state Owned by Examples Why separation matters
Java installation JDK/JRE vendor/runtime java, version, architecture A different Java can change startup compatibility and JVM behavior.
JMeter distribution Apache release files bin/, lib/, launchers Version and local modifications affect reproducibility.
JVM process Operating Java process heap, GC, system properties Generator resource limits live here, not in the JMX tree.
JMX test tree Project artifact Test Plan, Thread Group, sampler Describes configured behavior; it does not prove achieved load.
Thread state JMeter engine per-thread variables/session behavior Separate from JMeter properties and target-side state.
Target state System under test HTTP service, DB, queues, caches JMeter does not own or fully observe server-side capacity.
JTL Result artifact sample timestamps, elapsed time, success, labels Raw client-side sample evidence.
jmeter.log Engine log startup/config/runtime diagnostics Explains JMeter-side failures that a JTL alone may not.
HTML dashboard Report generator aggregate charts and statistics Derived presentation, not a replacement for raw evidence.

4. Release Java requirement versus development Java requirement

The current production release is JMeter 5.6.3. Its download page says it requires Java 8 or later, and the 5.6.x change notes recommend Java 17 or later. The current development repository is preparing the next major line and requires Java 17. Those facts are both true because they refer to different baselines.

Diagnostic rule: always identify the installed JMeter release first. Do not read a development-branch README that requires Java 17 and then conclude that a working 5.6.3 installation on an older supported Java must be invalid. Conversely, do not assume the next major release will continue accepting Java 8.

This course pins Java 17 for its labs because it satisfies the 5.6.3 release and aligns with the next-major direction. That is a lab reproducibility choice, not a retroactive change to the 5.6.3 documented minimum.

5. JRE versus JDK: execution and tooling are different needs

JMeter needs a compatible Java runtime to execute. A JDK includes that runtime plus development utilities such as keytool. The Apache development repository specifically notes that a JDK is better suited when recording HTTPS websites because certificate tooling is needed. Chapter 13 will cover recorder certificates in depth; for this course, a current JDK is the simpler standard lab installation.

You do not need a Java compiler merely to run the precompiled JMeter binary distribution. Plugin development or building JMeter from source is a different task.

6. GUI mode and CLI mode have different operational roles

The GUI helps a human create the tree, inspect component fields, and perform very small debugging runs. Apache documentation explicitly says not to run load tests in GUI mode. Real load execution must use CLI mode because the GUI and heavy listeners consume generator resources and can distort or limit the workload.

Mode Use it for Avoid using it for Primary evidence
GUI Constructing JMX, learning component fields, bounded debugging Significant load generation Saved JMX plus bounded debug observations.
CLI Reproducible load execution and automation Interactive tree editing CLI command, JTL, jmeter.log, optional dashboard.

7. The JMX file is configuration, not the whole experiment

JMX is XML that serializes the test-plan tree and component configuration. It can capture thread counts, sampler targets, timers, assertions, controllers, and many other settings. It cannot by itself capture every fact needed for reproducibility: the Java/JMeter binaries, external CSV files, command-line properties, environment variables, installed plugins/drivers, target build, host resource state, or the authorization window may live elsewhere.

Treat JMX as version-controlled source code, then record the other dependencies in a run manifest or CI job.

8. JTL, jmeter.log, and dashboard are separate evidence layers

A JTL written with -l records sample results. jmeter.log records JMeter's own logging and diagnostics; when you want one log per run, give it an explicit path with -j. The HTML dashboard summarizes a compatible sample log using -e -o during a CLI run or -g ... -o ... afterward.

Never preserve only the dashboard. If a report looks strange, you need the raw JTL and engine log to investigate what was actually recorded and whether the engine reported a problem.

9. Read-only inspection before installation changes

Before downloading or changing anything, inspect the identities already present on the workstation.

Linux/macOS:

command -v java || true
java -version
command -v jmeter || true
jmeter -v

Windows PowerShell:

Get-Command java -All -ErrorAction SilentlyContinue
java -version
Get-Command jmeter.bat -All -ErrorAction SilentlyContinue
if (Get-Command jmeter.bat -ErrorAction SilentlyContinue) {
    jmeter.bat -v
}

Record both path and version. A version string without a path can hide PATH precedence; a path without a version can hide an unexpected installation.

10. Why this matters in DevOps

CI runners, developer workstations, containers, and dedicated injectors must all execute the same test intent. That is impossible if “JMeter” means an unnamed local installation with unknown Java, edited defaults, and results saved to an overwritten desktop file. Reproducible performance engineering treats Java version, JMeter version, JMX, properties, data, command line, and artifacts as traceable inputs and outputs.

Knowledge check

What does the JMeter launcher do before the engine can run?

Why is a JMX file not enough to reproduce a performance run?

What is the operational difference between JTL and jmeter.log?

Why is GUI execution unsuitable for significant load?

JMeter 5.6.3 runs on Java 11. Does the current development README requiring Java 17 prove this installation is unsupported?

Next lesson

Build a verified installation and first plan

Lesson 2 downloads and integrity-checks the official 5.6.3 archive, unpacks it into a clean path, inspects the distribution, builds one loopback plan in the GUI, and executes the saved JMX through the CLI into unique artifacts.

Official references and version notes

Version and compatibility note

Version-sensitive statements were rechecked against current Apache JMeter primary sources on 2026-09-04. The current production release is Apache JMeter 5.6.3, whose download page states Java 8+; the 5.6.x change notes recommend Java 17 or later. The current development repository/next major line requires Java 17, so those development requirements are not retroactively applied to the 5.6.3 release. Mandatory labs use Java 17, the official 5.6.3 binary archive, no third-party plugins, the loopback target 127.0.0.1:8000, and CLI mode for the actual load run. The published SHA-512 for apache-jmeter-5.6.3.zip is 387fadca903ee0aa30e3f2115fdfedb3898b102e6b9fe7cc3942703094bd2e65b235df2b0c6d0d3248e74c9a7950a36e42625fd74425368342c12e40b0163076.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.