Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Apache Tomcat is an open-source Java servlet web container server that is used to deploy Java-based applications. Tomcat server primarily executes Java servlets and JSP for dynamic web applications. In configuring the Tomcat server, we can use CATALINA_OPTS and JAVA_OPTS env variables for JVM settings.

In this tutorial, we’ll look at the use of CATALINA_OPTS and JAVA_OPTS in the Tomcat server.

2. Importance of CATALINA_OPTS and JAVA_OPTS

Tomcat servers use the CATALINA_OPTS and JAVA_OPTS env variables for customized configuration. Both these env variables allow us to customize the JVM options for the Tomcat server, but they are used for slightly different purposes. Customization of JVM options is vital to achieving the high performance of a web application.

We can use these env variables for scalability and security in the server. Additionally, we can use these env variables for global JVM configurations, performance tuning, and configuration standardization.

The key difference between both the env variables is that any change in JAVA_OPTS applies to all the running Tomcat instances, whereas CATALINA_OPTS works only on a single Tomcat instance. Hence, we can use JAVA_OPTS to set global JVM configurations for all the Tomcat instances running on the same JVM.

3. Use of JAVA_OPTS

JAVA_OPTS is a key env variable to configure customized JVM settings. We can manage memory, GC configurations, and system properties using JAVA_OPTS. In order to understand the working of JAVA_OPTS. Let’s first run a Tomcat server using the docker run command:

$ docker run -d -p 8080:8080 --name baeldung  tomcat:latest

In the above command, we run a Tomcat server with an HTTP port exposed on 8080 using a docker container baeldung. Let’s also check out the default JVM settings in this Tomcat process:

$ ps -ef | grep tomcat
root         1     0  7 14:42 ?        00:00:01 /opt/java/openjdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED 
--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 
-classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat 
-Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

In the above command, we can see that the Tomcat server started with some default configurations. Now, if we need to make some changes to this Tomcat process, we would need to add that customized configuration in JAVA_OPTS. Let’s make changes to the min/max heap of a Tomcat server process:

$ export JAVA_OPTS="-Xmx512m -Xms256m"

The above command will simply update the max 512m and min 256m memory on the server. In the Docker container, we can provide the env variables in the run command itself:

$ docker run -d -p 8080:8080 -e JAVA_OPTS="-Xmx512m -Xms256m" --name baeldung tomcat:latest

To verify, let’s check the process details of the Tomcat server again:

$ ps -ef | grep tomcat
root         1     0  8 14:49 ?        00:00:01 /opt/java/openjdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx512m -Xms256m -Djdk.tls.ephemeralDHKeySize=2048 
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 
--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED 
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 
-classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat 
-Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

In the above output, we can see that both the max and min heap are set to 512m and 256m, respectively. Similarly, we can use JAVA_OPTS for garbage collection configurations as well.

In short, we can use JAVA_OPTS to customize the JVM configurations as per server requirements. Additionally, It permits us to tune memory management, server profiling, GC tasks, and resource utilization of a Tomcat process.

4. Use of CATALINA_OPTS

CATALINA_OPTS is an env variable that allows us to customize Apache server-related configurations. Unlike JAVA_OPTS, which is primarily used to configure JVM-related options, CATALINA_OPTS mainly configure Tomcat server-related configurations. To demonstrate, let’s run the command to change the HTTP port of the Tomcat server:

$ docker run -d -p 8080:8082 -e CATALINA_OPTS="-Dcatalina.http.port=8082" --name baeldung tomcat:latest

In the above command, we updated the default HTTP port of the Tomcat server from 8080 to 8082. To verify, let’s check out the command to see the updated HTTP port of the Tomcat server:

$ ps -ef | grep tomcat
root         1     0  1 15:12 ?        00:00:02 /opt/java/openjdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED 
--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 
-Dcatalina.http.port=8082 -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat 
-Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

In the output of the above command, we can see that the HTTP port is updated to 8082. One of the main uses of CATALINA_OPTS is to add custom system properties. To demonstrate, let’s look at the command:

$ export CATALINA_OPTS="$CATALINA_OPTS -Dcustom.property=baeldung-example-value"

In the above command, we added a custom property to the Tomcat server. Upon setting this environment and restarting the Tomcat server, the Java application and Tomcat server will access this custom property value. We can also provide a whole configuration property using this command. To illustrate, let’s look at the command:

$ export CATALINA_OPTS="$CATALINA_OPTS -Dbaeldungapp.config=/usr/local/tomcat/config/config.properties"

In the above command, we provided the config file for the baeldung application using the baeldungapp.config property file. Just restarting the server makes this configuration work.

5. Conclusion

In this article, we explored the applications of CATALINA_OPTS and JAVA_OPTS in a Tomcat server. First, we changed the JVM configuration of the Tomcat server using JAVA_OPTS. After that, we updated the HTTP port of the Tomcat server using CATALINA_OPTS.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.