As of raising this question, Docker looks to be new enough to not have answers to this question on the net. The only place I found is this article in which the author is saying it is hard, and that's it.
7 Answers
Note that in a docker-compose.yml
file - you'll need to leave out the double-quotes:
environment:
- JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
or
environment:
- CATALINA_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m

- 34,745
- 30
- 150
- 304
-
1setting CATALINA_OPTS is a bad idea, it can blow away a lot of other options set by default in the container – Trevor Rudolph Apr 18 '19 at 16:20
-
81 year later i actually realized that JVM_OPTS does nothing for my project (got OOM) :) what really works is _JAVA_OPTIONS – deviant Feb 06 '20 at 10:34
-
1JVM_OPTS didn't work for me either but _JAVA_OPTIONS did. Thanks both! – Vlad Schnakovszki Mar 10 '21 at 09:45
I agree that it depends on what container you're using. If you are using the official Tomcat image, it looks like it's simple enough, you will need to pass the JAVA_OPTS
environment variable with your heap settings:
docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat

- 1,555
- 1
- 18
- 22

- 4,907
- 2
- 20
- 21
Update: Regarding this discussion, Java has upped there game regarding container support. Nowadays (or since JVM version 10 to be more exact), the JVM is smart enough to figure out whether it is running in a container, and if yes, how much memory it is limited to.
So, rather than setting fixed limits when starting your JVM, which you then have to change in line with changes to your container limits (resource limits in the K8s world), simply do nothing and let the JVM work out limits for itself.
Without any extra configuration, the JVM will set the maximum heap size to 25% of the allocated memory. Since this is frugal, you might want to ramp that up a bit by setting the -XX:MaxRAMPercentage
attribute. Also, there is -XX:InitialRAMPercentage
for initial heap size and -XX:MinRAMPercentage
for containers with less than 96MB RAM.
For more information on the topic, here is an excellent overview.

- 11,026
- 4
- 41
- 60
-
-
1Please keep in mind that this mechanism was broken again with cgroups v2 and was fixed with JVM version 15: https://bugs.openjdk.org/browse/JDK-8230305 – Fritz Duchardt Jun 13 '22 at 07:43
-
Thank you sir. you saved my time again. It did not work for me. With 17, it works just great. Please answer this info as part of this question. So that i could accept and you could help others. https://stackoverflow.com/questions/72596403/java-heap-inside-docker-container – RamPrakash Jun 13 '22 at 13:53
-
You can also just place those settings in your image so something like the following would exist in your Dockerfile:
ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"

- 5,303
- 5
- 56
- 81
-
I'm pretty sure that setting a JAVA_OPTS environment variable will only work in the official Tomcat image. It may not work if you've created your own Tomcat image (eg by using Ubuntu base and installing Tomcat as part of build) – Garreth McDaid Apr 14 '17 at 09:29
you can do it by specifying java options environment in docker compose file
env:
- name: _JAVA_OPTIONS
value: "-Xmx1g"
it will change the heap size.

- 149
- 1
- 4
-
Do you maybe know why some environments use `_JAVA_OPTIONS`? This is the one that worked for me, while `JAVA_OPTS` or `JVM_OPTS` didn't work. – emilanov Jun 16 '22 at 09:23
It all depends how your Java application is packaged and how it's configuration files are exposed using Docker.
For example the official tomcat image states that the configuration file is available in the default location: /usr/local/tomcat/conf/
So easy to override entire directory or just one configuration file:
docker run -it --rm -p 8080:8080 -v $PWD/catalina.properties:/usr/local/tomcat/conf/catalina.properties tomcat:8.0

- 76,015
- 10
- 139
- 185
You can set the Xms
and Xmx
values in the dockerfile using the following way as well.
ENTRYPOINT ["java", "-Xms128M ", "-Xmx256M", "-jar", "your-precious-service-1.0.0.jar"]
You can also ignore the Xms
value and just set the Xmx
value.
ENTRYPOINT ["java", "-Xmx256M", "-jar", "your-precious-service-1.0.0.jar"]
For more info please read : https://akobor.me/posts/heap-size-and-resource-limits-in-kubernetes-for-jvm-applications

- 3,318
- 5
- 38
- 42