WildFly JVM Settings
Internal
Overview
JVM settings can be declared in various server configuration files, as shown below.
In domain mode, the server instance JVM settings can be declared both in domain.xml and host.xml, and they are propagated by the domain controller and host controllers to the server instance JVMs. The effective values are subject to precedence rules.
For the process controller and host controller JVM settings are declared in domain.conf.
Configuration
Standalone Mode
Modify standalone.conf as follows:
... JAVA_OPTS="-Xms1000m -Xmx2000m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ..." ...
Even if standalone*.xml allows for a <jvm> element, it seems it is not honored when specified. More research is needed on this.
Standalone Mode GC Logging
GC logging is turned on by default in standalone.sh:
... PREPEND_JAVA_OPTS="$PREPEND_JAVA_OPTS -verbose:gc -Xloggc:\"$JBOSS_LOG_DIR/gc.log\" -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading" ...
For more details on generic Java GC logging see
Domain Mode
In domain mode, the settings declared in XML configuration files domain.xml and host.xml propagate to server node JVMs and they are subject to precedence rules. Process controller and host controller JVM settings are declared in domain.conf.
domain.conf
Declare the JVM settings for both process controller and host controller:
... if [ "x$JAVA_OPTS" = "x" ]; then JAVA_OPTS="-Xms64m -Xmx512m -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true" ...
By default, both JVM types share the same configuration, but it can be differentiated by using HOST_CONTROLLER_JAVA_OPTS and PROCESS_CONTROLLER_JAVA_OPTS environment variables, as in the following example:
if [ "x$JAVA_OPTS" = "x" ]; then JAVA_OPTS="-Djava.net.preferIPv4Stack=true" ... fi if [ "x$PROCESS_CONTROLLER_JAVA_OPTS" = "x" ]; then PROCESS_CONTROLLER_JAVA_OPTS="-Xms52m -Xmx252m -XX:MaxMetaspaceSize=122m $JAVA_OPTS" fi if [ "x$HOST_CONTROLLER_JAVA_OPTS" = "x" ]; then HOST_CONTROLLER_JAVA_OPTS="-Xms53m -Xmx253m -XX:MaxMetaspaceSize=123m $JAVA_OPTS" fi ...
domain.xml
<domain ...> ... <server-groups> <server-group name="..."> <jvm java-home="..." type="SUN|IBM" env-classpath-ignored="true" debug-enabled="false" debug-options="..."> <heap size="" max-size=""/> <permgen>...</permgen> <stack>...</stack> <agent-lib>...</agent-lib> <agent-path>...</agent-path> <java-agent>...</java-agent> <jvm-options> <option name="...">....</option> ... </jvm-options> <environment-variables>...</environment-variables> <launch-command>...</launch-command> </jvm> </server-group> </server-groups> ... </domain>
host.xml
host.xml allows "named" <jvm> declarations.
<host ..> ... <jvms> <jvm name="jvm-a" ... /> <jvm name="jvm-b" ... /> ... </jvms> <server name="..." group="..."> <jvm name="..."/> </server> </host>
The Common Configuration Syntax
<jvm name="..."> <heap size="1000m" max-size="2000m"/> <jvm-options> <option value="-server"/> <option value="-XX:MetaspaceSize=256m"/> <option value="-XX:MaxMetaspaceSize=512m"/> <option value="-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"/> </jvm-options> </jvm>
Precedence Rules
The more specialized child elements will override parent configuration, allowing for the declaration of specific server configuration without requiring exclusion at the host or server group level. The parent configuration is inherited by other levels.
At least for EAP 7.0.5, it seems that both domain.xml and host.xml settings are applied to the server node:
... /opt/jdk/bin/java -D[Server:app02] -Xms255m -Xmx765m -server -XX:MetaspaceSize=96m -XX:MaxMetaspaceSize=256m -server -XX:MetaspaceSize=95m -XX:MaxMetaspaceSize=255m ...
which shows that it's best to only specify a configuration in just one location.
Domain Mode GC Logging
For more details on generic Java GC logging see