Keywords: Gradle | Daemon | Build Tool | Process Management | Performance Optimization
Abstract: This technical paper provides an in-depth analysis of Gradle daemon operations, examining the causes behind "Starting a Gradle Daemon, 1 busy and 6 stopped Daemons could not be reused" warnings. It details the use of gradle --status for monitoring daemon states, gradle --stop for graceful shutdowns, and explores automatic cleanup mechanisms. Through practical examples and code demonstrations, developers gain comprehensive understanding of managing daemon resources during Gradle build processes.
Understanding Gradle Daemons
The Gradle daemon is a critical component of the Gradle build system, running persistently in the background to accelerate subsequent build tasks. When executing commands like gradle clean, the system attempts to reuse existing daemons. If reuse fails, messages such as Starting a Gradle Daemon, 1 busy and 6 stopped Daemons could not be reused appear.
Monitoring Daemon Status
The gradle --status command provides visibility into all Gradle daemons currently active in the system. The output includes process IDs (PID), status information, and version details:
$ gradle --status
PID STATUS INFO
11506 BUSY 4.3.1
8027 STOPPED (stop command received)
9347 STOPPED (stop command received)
11727 STOPPED (by user or operating system)
4786 STOPPED (by user or operating system)
14569 STOPPED (by user or operating system)
31237 STOPPED (by user or operating system)
This output reveals one busy daemon and six stopped daemons, with stopping reasons ranging from explicit stop commands to system or user interventions.
Graceful Daemon Shutdown
When explicit termination of running daemons is necessary, the gradle --stop command sends shutdown signals to all daemons of the current Gradle version:
$ gradle --stop
Stopping Daemon(s)
2 Daemons stopped
After executing the stop command, subsequent status checks show all daemons in stopped state:
$ gradle --status
No Gradle daemons are running.
PID STATUS INFO
8027 STOPPED (stop command received)
9347 STOPPED (stop command received)
12448 STOPPED (stop command received)
11506 STOPPED (stop command received)
11727 STOPPED (by user or operating system)
4786 STOPPED (by user or operating system)
14569 STOPPED (by user or operating system)
31237 STOPPED (by user or operating system)
It's important to note that gradle --stop only affects daemons of the current Gradle version, leaving daemons of other versions unaffected.
Automatic Daemon Management
Gradle incorporates intelligent daemon management features. Any daemon idle for more than 3 hours is automatically terminated, eliminating the need for manual cleanup in most scenarios. This design optimizes build performance while preventing long-term resource consumption.
Daemon Reuse Conditions Analysis
Multiple factors can prevent daemon reuse. As demonstrated in reference cases, changes in environment variables or inconsistent build conditions may force Gradle to create new daemons rather than reusing existing ones, explaining the observed proliferation of daemon processes in certain situations.
Here's a pseudo-code example illustrating daemon creation logic:
public class GradleDaemonManager {
private List<DaemonProcess> availableDaemons;
public DaemonProcess getOrCreateDaemon(BuildEnvironment env) {
for (DaemonProcess daemon : availableDaemons) {
if (daemon.isCompatible(env) && daemon.isIdle()) {
return daemon;
}
}
// No reusable daemon available, create new one
DaemonProcess newDaemon = createNewDaemon(env);
availableDaemons.add(newDaemon);
return newDaemon;
}
private DaemonProcess createNewDaemon(BuildEnvironment env) {
System.out.println("Starting a Gradle Daemon, " +
getBusyCount() + " busy and " +
getStoppedCount() + " stopped Daemons could not be reused");
return new DaemonProcess(env);
}
}
Manual Daemon Directory Cleanup
In exceptional circumstances where daemons behave abnormally or complete cleanup is required, the Gradle daemon directory can be manually removed. Daemon data typically resides in the .gradle/daemon folder within the user's home directory:
/users/[username]/.gradle/daemon
This directory contains subdirectories organized by Gradle version. Deleting these directories forces complete cleanup of all daemon-related data.
Best Practices Recommendations
Based on comprehensive understanding of Gradle daemon behavior, we recommend:
- Regularly monitor daemon status using
gradle --status - Maintain running daemons for optimal performance in stable build environments
- Use
gradle --stopas initial troubleshooting step when encountering build issues - Avoid frequent modifications to build environment variables to minimize unnecessary daemon creation
- Configure appropriate daemon timeout settings in continuous integration environments
Through proper Gradle daemon management, developers can achieve optimal build performance while maintaining efficient system resource utilization.