9 Things I Regret Not Knowing About Running Java JAR Applications

·

3 min read

1. Basic Command for Running a JAR File

The simplest way to run a JAR file is by using the java -jar command:

java -jar myapp.jar

This command instructs the Java Virtual Machine (JVM) to execute the JAR file specified (in this case, myapp.jar).

2.Running with Memory Settings

nohup java -Xmx1024m -jar myapp.jar &

In this example, the JVM is also given a maximum heap size of 1024 MB (-Xmx1024m). Adjusting the memory settings is a good idea to prevent OutOfMemoryErrors, particularly with large applications.

This basic command might not be enough in production environments, where you need to account for memory constraints, logging, security, and long-running processes.

3. Setting Java Options for Performance Optimization

Java provides numerous options to tune the performance of the JVM, depending on your application’s needs. Common ones include:

  • Heap Size (-Xmx and -Xms): Adjust the maximum (-Xmx) and initial (-Xms) heap sizes. For example:
java -Xms512m -Xmx1024m -jar myapp.jar
  • This sets the initial heap size to 512 MB and the maximum heap size to 1024 MB.

  • Garbage Collection: Specify the garbage collection algorithm with flags such as -XX:+UseG1GC (recommended for large applications) or -XX:+UseParallelGC (for multi-threaded applications).

java -XX:+UseG1GC -jar myapp.jar

5. Environment Variables for JVM Configuration

Sometimes, it’s more convenient to set environment variables for JVM options instead of passing them directly in the command. This is especially useful if you have multiple Java applications on the same server and want to configure each differently.

Example: Setting Environment Variables

export JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
java $JAVA_OPTS -jar myapp.jar

This command allows you to reuse JAVA_OPTS across different applications or sessions without rewriting the flags each time.

6. Debugging Options

If you need to debug your Java application, you can enable remote debugging with the -agentlib:jdwp option.

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar myapp.jar

This command:

  • Enables debugging on port 5005.

  • Allows remote debugging tools to connect to your application for monitoring and troubleshooting.

7. Executing the Command in Production: Best Practices

  • Use nohup for Long-Running Processes: This ensures the application continues running even if your terminal session closes.

  • Log Output to a Dedicated File: This makes it easier to monitor and debug by organizing logs per instance.

  • Set Memory Limits According to Application Needs: This prevents excessive memory usage and optimizes performance.

  • Test JVM Options: Start with recommended options like -Xms, -Xmx, and -XX:+UseG1GC, then adjust as needed based on your application’s resource demands.

8. Full Example Command for Production

A final example combining all elements:

sudo nohup java -Xms512m -Xmx2048m -XX:+UseG1GC -jar myapp.jar > /var/log/myapp.log 2>&1 &

This command:

  1. Runs the Java application with root privileges (sudo).

  2. Allocates initial (512 MB) and maximum (2048 MB) heap sizes.

  3. Uses the G1 garbage collector.

  4. Runs in the background and redirects all output to a specified log file.