Apache JMeter: a Java load tester you run from a directory, not a cloud account
Apache JMeter open-source load testing tool for analyzing and measuring the performance of a variety of services
At a glance
- What is it?
- Apache JMeter measures the performance of HTTP, JDBC, JMS, FTP, LDAP and TCP endpoints from a single Java installation. It is a strong fit for teams that need to record a browser session and replay it headlessly, and a poor fit for anyone unwilling to manage JVM memory and distributed workers.
- Who is it for?
- Adopt JMeter when you need one tool that can drive HTTP, JDBC, JMS, LDAP, FTP, SMTP and raw TCP from the same test plan, and when you want the plan stored as a text .jmx file you can diff. Do not adopt it if you only need a small scripted HTTP check and would rather write code than configure components, or if nobody on the team can tune JVM heap and run remote workers.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 18 days ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Apache JMeter tests that a browser tab cannot
Apache JMeter is described in its README as an open source Java application designed to measure performance and load test applications. The interesting part is the protocol list. The same tool can drive Web (HTTP and HTTPS), SOAP and REST web services, FTP, databases through JDBC, LDAP, message-oriented middleware through JMS, mail over SMTP, POP3 and IMAP, native commands or shell scripts, TCP, and Java objects. A team that already owns JMeter for HTTP does not need a second tool the day someone asks whether the message broker or the login database holds up.
The audience is therefore not only QA engineers. It is anyone who has to produce a number about a service under concurrency: a backend developer checking a connection pool, an SRE validating a capacity plan, a performance engineer building a regression suite. The README also notes that JMeter is built by The Apache Software Foundation, which matters for procurement: the licence is Apache-2.0 and the project publishes its own documentation in the docs directory of the release.
One boundary is worth stating early. JMeter drives load from the machine it runs on. It is not a browser, so it does not execute JavaScript or render a page unless you add a sampler that does. If your performance question is about client-side rendering time, JMeter measures the wrong thing.
Thread groups, samplers and listeners: the actual execution model
A JMeter test is a tree, and the README's feature list maps onto it. Multi-threading allows concurrent sampling by many threads, and separate thread groups can sample different functions at the same time. So a thread group is the unit of concurrency: you configure a number of threads and a ramp-up, and each thread walks the samplers underneath it in order. Samplers are the work, one per request or interaction. Controllers decide how many times the samplers beneath them run. Listeners collect results, and the README points at pluggable tiers for the load statistics you want to keep.
The correlation story is the part that separates JMeter from a naive loop of curl calls. Extractors pull values out of responses in HTML, JSON, XML or any textual format, using CSS and JQuery selectors, a JSON extractor, XPath, or a regular expression. A login token captured from the first response can be fed into every subsequent request, which is what makes a recorded session replayable rather than a fixed script.
Execution itself is headless. The README documents a command-line mode, described as non-GUI or headless, that runs from any Java-compatible OS. The GUI exists for recording, building and debugging a plan, not for producing load. That distinction is the single most common source of bad results: a plan that looks fine in the GUI is not evidence of anything, because the GUI itself consumes the machine you are measuring from.
Installing JMeter and running a first headless test
The README's requirements section is short and strict. A fully compliant Java 17 Runtime Environment is required. A JDK with the keytool utility is better suited for recording HTTPS websites, because recording a TLS session means generating a certificate. Some jars are not bundled: a JDBC driver comes from the database supplier, a JMS provider supplies its own client, and Bouncy Castle is only needed for the SMIME assertion. Those go in the lib directory.
Installation is unpacking a binary archive into a suitable directory. The README warns that spaces in directory names can cause problems, so pick a path without them. The documented startup sequence is two steps: change to the bin directory, then run the launcher for your platform.
cd bin
./jmeterOn Windows the equivalent is the batch file in the same directory, and the README documents three drag-and-drop helpers for .jmx files: jmeter-n.cmd runs the file as a non-GUI test, jmeter-n-r.cmd runs it as a non-GUI remote client-server test, and jmeter-t.cmd loads the file ready to run as a GUI test.
For a first real run, build or record a plan in the GUI, save it as a .jmx file, then execute it without the GUI. The README documents the non-GUI command-line mode and links to a manual page for generating the HTML dashboard from a result file, plus live reporting into third-party databases such as InfluxDB or Graphite. That live path is the option to pick when you want a dashboard during the run rather than after it.
Where JMeter gets expensive: heap, threads and remote workers
The README lists no performance figures, and that is the honest position: the number of threads a single JMeter process can drive depends on the machine, the samplers, the listeners you enabled and the JVM heap you gave it. A plan that holds every response body in memory will fall over long before the target does, and the failure looks like a JMeter error, not a server error. Disabling listeners during the run and keeping only the raw output is the usual mitigation, but it is a trade-off: you lose the live view that made the GUI pleasant.
Distributed testing is the documented answer, and it is also the sharpest edge. The Windows helper jmeter-n-r.cmd is described as a non-GUI remote client-server test, which implies a controller and remote server processes. Running that topology means matching JMeter versions across machines, opening the RMI ports, and accepting that a slow or misconfigured worker silently skews the aggregate. The README does not document rollback, retry or partial-failure semantics for a remote run, so a half-failed distributed test is something you diagnose from the logs yourself.
The wrong-tool case is equally concrete. If your question is "does this page feel fast in a real browser", JMeter answers a different question, because it does not render. If your test is a single HTTP request with a threshold, a small script in a general-purpose language will be shorter than a .jmx file. And if your team has no Java runtime on the build agents, you are adding one before you add a single test.
JMeter versus k6: a GUI tree against a script file
The comparison people search for is jmeter vs k6, and the difference is in the artifact you maintain. JMeter's plan is a tree you assemble in a GUI and save as .jmx, an XML file that is diffable but not pleasant to read. Its extension path is the pluggable sampler and the JSR223-compatible scripting sampler, with Groovy as the README's example language, so custom logic lives inside a component rather than in a program.
A code-first tool such as k6 inverts that. The test is a script in a programming language, reviewed like any other source file, and the runtime is chosen for load generation rather than for being the JVM. You give up the recorder and the component palette; you gain a test that a developer can read in a pull request without opening a GUI.
Neither choice is free. JMeter's advantage is breadth: the protocol list in the README, from JDBC to JMS to LDAP to SMTP, is hard to match in a single scripting runtime, and the extractor set for HTML, JSON, XML and free text covers most correlation work without writing a parser. If your load test has to touch a database and a message queue in the same scenario, that breadth is the deciding factor. If it is one HTTP endpoint, it is not.
Licence, releases and what upgrading actually costs
Apache JMeter is licensed under Apache-2.0, and the repository carries LICENSE and NOTICE files at the top level, which is the standard arrangement for an Apache Software Foundation project. For most users that means permissive use with attribution requirements and a patent grant; it is not legal advice, and organisations with strict policy should read the LICENSE file rather than a summary.
The release facts are worth reading carefully. The most recent release tags are rel/v5.6.3 and rel/v5.6.2, both dated 2024-01-09, with rel/v5.6.1 from 2023-07-10. The repository's last push was on 2026-09-12, so the source tree sees activity even though the last tagged release is older. Practically, that means fixes and changes land on master before they reach a downloadable version, and a team that wants a specific fix may be waiting for the next release rather than installing it.
Upgrade cost is driven by the plan, not the binary. Swapping the archive is trivial; the work is re-running your .jmx files and confirming that extractors, plugin-provided components and any optional jars still behave. The README points at a plugin ecosystem and at third-party libraries for Maven, Gradle and Jenkins, and plugins are the usual source of breakage across a major version. Pin the JMeter version in CI the same way you pin any other build dependency, and keep the .jmx files in version control so a regression is visible as a diff.
Editorial conclusion
Adopt JMeter when you need one tool that can drive HTTP, JDBC, JMS, LDAP, FTP, SMTP and raw TCP from the same test plan, and when you want the plan stored as a text .jmx file you can diff. Do not adopt it if you only need a small scripted HTTP check and would rather write code than configure components, or if nobody on the team can tune JVM heap and run remote workers. Before committing, verify that a Java 17 runtime is available on every machine that will run the test, that the optional JDBC or JMS driver jars your plan needs are present in lib, and that your reporting target (the HTML dashboard or an InfluxDB or Graphite sink) is reachable from the load generator.
Frequently asked questions
What is Apache JMeter and why is it used?
It is an open source Java application from The Apache Software Foundation for measuring performance and load testing applications. It is used to simulate heavy load on a server, group of servers, network or object and to analyse behaviour under different load types.
Does Apache JMeter require coding?
No. A test plan can be recorded from a browser or a native application and assembled from components in the Test IDE. Coding becomes relevant only for custom logic, which the README handles through scriptable samplers using JSR223-compatible languages such as Groovy.
Is Apache JMeter free or paid?
It is free and open source, licensed under Apache-2.0 by The Apache Software Foundation. The binary archive can be unpacked and run without a licence purchase.
How do I install Apache JMeter?
Unpack the binary archive into a directory whose path contains no spaces, then run the jmeter script from the bin directory on Unix-like systems or jmeter.bat on Windows. A fully compliant Java 17 Runtime Environment must be installed first.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/apache-jmeter)