What does UseContainerSupport VM parameter do? - java

What does this option do in docker file?
ENTRYPOINT java -XX:+UseContainerSupport $JAVA_OPTIONS -jar /myapp.jar
Will the docker container start without this parameter?
I checked one article which says
enable memory support
but it is still not clear to me.

Starting from Java 10, this parameter (which is enabled by default) is used to make the JVM take the container memory limits into account when allocating the heap size, not the host machine configuration.
This option was backported to Java 8:
https://www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html
Examples:
If you run:
docker run **-m 1gb** openjdk:8u131 java -XshowSettings:vm -version
The result is going to be (on my machine Ubuntu with 8gb)
Max. Heap Size (Estimated): 1.68G
I set a memory limit for the container but it ignored and used the host config (it uses by default total memory/4)
Now if I run the version that has the new feature (link above) you can see that the container memory limite was taken into account:
docker run **-m 1g** openjdk:8u191-jre-alpine java -XshowSettings:vm -version
Result (total memory / 4):
VM settings:
Max. Heap Size (Estimated): 247.50M
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
openjdk version "1.8.0_191"
At the time I'm writing this the LATEST version of the openjdk:8 image is 222 so you can use this version. That has the feature included.
For more information:
Explains this flag use in Java 10: https://medium.com/adorsys/jvm-memory-settings-in-a-container-environment-64b0840e1d9e
Using this flag with Java 8: https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54

Yes. The container will start without -XX:+UseContainerSupport.
-XX:+UseContainerSupport is used to allocate a larger fraction of memory.
To prevent the JVM adjusting the maximum heap size when running in a container, set -XX:-UseContainerSupport.
In addition to that, https://www.eclipse.org/openj9/docs/xxusecontainersupport/ might be helpful.

Related

Java heap inside docker container

I ran this command which I found in this blog.
docker run -m 1GB openjdk:10 java \
-XX:+UseContainerSupport \
-XX:MinRAMPercentage=50 \
-XX:MaxRAMPercentage=80 \
-XshowSettings:vm \
-version
My output is this.
VM settings:
Max. Heap Size (Estimated): 3.86G
Using VM: OpenJDK 64-Bit Server VM
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Debian-2)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Debian-2, mixed mode)
I am little bit confused now is that , when I limit the memory to 1G, why does Java see 3.86G or What needs to be done to make java see container memory limits ?
Note: I am on MAC. docker creates container inside the VM. So not sure if it matters.
When using Java in containers, one needs to be mindful of to what degree the JVM is aware of the resource limits set for the container it runs in. With Java version 10 (released in 2018) the JVM was first enabled to figure out whether it is running in a container, and if yes, how much memory was allocated to the container. Back then, CGroups V1 was used by the Linux Kernel to curtail the memory available to containers.
In the mean time, CGroups V2 (conceived in 2016) is gaining traction and is increasingly becoming the default for new Linux releases (e.g. Ubuntu and Flatcar Linux made it default in 2021). This means, once again a Java update is required to support CGroups V2 for correct handling of JVM resource limits and Heap configuration, which for OpenJDK came with Java version 15.

Memory allocation issues with JDK SE 8 (Not happens with OpenJDK 8 from AdoptOpenJDK)

About the following message:
Could not reserve enough space for 3145728KB object heap
I need some tips to understand what's going on
Points & Observations:
Running over Windows 10 x64 (16G Memory)
It only happens using this distribution: https://jdk.java.net/java-se-ri/8-MR3
It works fine using the build from AdoptOpenJDK: https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot
At pom.xml, I've tried to add the following line: <extraJvmArgs>-Xms1G -Xmx4G -Xss1M -XX:-UseGCOverheadLimit -XX:MaxHeapSize=4G</extraJvmArgs>. But it "complains" The specified size exceeds the maximum representable size. (The original Xmx and MaxHeapSize was 3G)
Main Objective: To compile a project that was done previously using Oracle JDK8 with the Open JDK8
Any "lights"?
------ Edit
arg -d64 returns Error: This Java instance does not support a 64-bit JVM.
Maybe it's 32 bits the compilation from Java website?

What does 'MaxRAM' JVM parameter signify?

I'm looking at the configuration of a JVM running on a linux server. when I run
java -XX:+PrintFlagsFinal | less | grep -iE 'MaxRam'
Which seems to basically print out just about every parameter the JDK knows about
I see
uint64_t MaxRAM = 137438953472 {pd product}
but I can't seem to find much documentation on this flag.
I found that "{pd product}" signifies "Platform Dependent Product: An officially supported, internal JVM option"
Anyone know exactly what this parameter signifies, or where I can read in more detail about platform specific JVM flags?
Misc details:
Java -version:
.
java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01, mixed mode)
uname -a
Linux [SERVERNAME] 2.6.32-431.17.1.el6.x86_64 #1 [DATE] x86_64 x86_64 x86_64 GNU/Linux
According to Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide document the value in MaxRAM is used to calculate the Default Heap Size if no initial heapsize and max heap size is specified and contains as posted previously
Default Heap Size
Unless the initial and maximum heap sizes are specified on the command line, they are calculated based on the amount of memory on the machine. The proportion of memory to use for the heap is controlled by the command-line options InitialRAMFraction and MaxRAMFraction
[...]
The value of MaxRAM is platform-dependent.
Referring to the The Java Virtual
Machine Specification the size of the heap can change, depending of the implementation of the JVM.
The heap may be of a fixed size or may be expanded as
required by the computation and may be contracted if a larger heap becomes
unnecessary. The memory for the heap does not need to be contiguous.
A Java Virtual Machine implementation may provide the programmer or the user control
over the initial size of the heap, as well as, if the heap can be dynamically expanded or
contracted, control over the maximum and minimum heap size.
And to answer your platform specific JVM flags question:
Java HotSpot VM Options

Unable to start Weblogic 10.3

I am using Windows 8 Pro 64 bit, Java 1.6 64 bit. I am trying to start Weblogic with following memory args (setDomainEnv.cmd):
set USER_MEM_ARGS=-Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m
But i'm getting an error:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Those mermory args are required to deploy the app, so i can't lower it (physical mermory installed - 8 GB).
Combined with -Xmx512M use -d64 to make sure you're running 64-bit VM. On a 64-bit machine I thought for sure I was running 64-bit virtual machine, but no. After installing 64-bit Java the -d64 option works and -Xmx allows much larger memory sizes.
java -d64 -Xmx512M mypackage.Test
Please see the below link for more solutions...
Could not reserve enough space for object heap
I am running weblogic 81. I had min=1024 and max =1024m with 4gb or RAM. 64bit processor and 32 bit java. I tried to increase the min/max value, it did not work. So, I changed the min/max to 512m and 1024m respectively. Thn it started to work.
When i installed for first time, the SOA environment developed mode, needed to do that:set JAVA_OPTIONS=%JAVA_OPTIONS% set DEFAULT_MEM_ARGS=-Xms512m -Xmx768m set PORT_MEM_ARGS=-Xms768m -Xmx1536m But over time, it shows me the same error and tube to make the following change: set JAVA_OPTIONS=%JAVA_OPTIONS% set DEFAULT_MEM_ARGS=-Xms512m -Xmx512m set PORT_MEM_ARGS=-Xms512m -Xmx512m But I'm still not sure why this happens.

Tomcat problem - Could not reserve enough space

I am running server with 256MB RAM. Maximum heap size I can allocate for Java is 110MB. When I add those param to JAVA_OPTS I can run java -version. Problem is that I can not run Tomcat with these parameters. Maximum heap size for Tomcat to run is 40MB. I do not know why I can not allocate more memory?
Of course I get error:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Set CATALINA_OPTS to -Xmx110m, JAVA_OPTS. I suppose you could set both, to be sure.
The Xmx flag may be ignored when you run the java executable with the -version flag. This depends on how you pass the version flag. The following are the results on my machine with 2GB RAM:
Version flag passed before Xmx
C:\Users\Reynolds>java -version -Xmx10240M
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)
which is weird considering that 10G is beyond the max addressable limit on memory in a 32-bit environment.
Version flag passed after Xmx
C:\Users\Reynolds>java -Xmx10240M -version
Invalid maximum heap size: -Xmx10240M
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.
C:\Users\Reynolds>java -Xmx1524M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
which is closer to reality.
You might want to verify how much contiguous memory is available to Java in reality, using the second approach, and then decide on an optimal value for the maximum heap size.
The error message suggests you do not have enough free RAM try closing other applications and seeing if you can allocate a larger heap then. You may need more RAM I am afraid.

Categories

Resources