Posted Jan 08 by AppWorks Developer.
Updated Jan 09 by Werner De Jong.

How to set memory options for the JVM with a "" configuration file.

168146 views. 0 comments.

Author: Dean Hutchinson, Quality Assurance Analyst, OpenText

Memory- Heap and PermGen

After searching for answers on where to set memory options for the JVM, specifically for AppWorks on Tomcat, I found that the best place to put them is in a file called “”, under the tomcat/bin directory.

The two memory specific options that most commonly affects AppWorks has to do with Heap and PermGen size. If you've followed the installation guide, these settings have already been taken care of. However, should you be experiencing any tomcat server issues, a quick check of the catalina.out log file should reveal the source of the problem.

For errors pertaining to “heap”, we will be tweaking the “-Xmx” setting.

Some notes on this now…

  • The default heap size is typically 64MB.
  • This setting is of the form -Xmx(memorysize). i.e. -Xmx2048m sets the max heap size to 2048 megabytes.
  • 32 bit JVM is limited to approximately 1.8GB on Windows and 2GB on Linux.
  • Performance recommendation is to set the initial heap size equal (-Xms) to the max heap size.

For errors pertaining to “PermGen”, normally logged as “java.lang.OutOfMemory:PermGen space”, we will be tweaking the “-XX:MaxPermSize” setting.

Some notes on this…

  • There is a difference in defining the heap parameter vs the PermGen parameter in that the PermGen parameter uses an equal sign for setting the value. i.e. -XX:MaxPermSize=256m” sets the size to 256 megabytes.
  • The 2 most common values that have brought success have been either 256m or 512m.

Take a look at the sample file below. Along with the memory options defined above, there are several other parameters that can be changed for server performance and stability.

Complete credit for this goes to Terrance A. Snyder -

#! /bin/sh
# ==================================================================
# ______ __ _____
# /_ __/___ ____ ___ _________ _/ /_ /__ /
# / / / __ \/ __ `__ \/ ___/ __ `/ __/ / /
# / / / /_/ / / / / / / /__/ /_/ / /_ / /
#/_/ \____/_/ /_/ /_/\___/\__,_/\__/ /_/

# Multi-instance Apache Tomcat installation with a focus
# on best-practices as defined by Apache, SpringSource, and MuleSoft
# and enterprise use with large-scale deployments.

# Credits:
# Google -> Couldn't survive without it
# -> Community support
# SpringSource -> Specifically best-practices and seminars (Expert Series)

# Based On:

# Created By: Terrance A. Snyder
# URL:,

# Best Practice Documentation:

# Looking for the latest version?
# github @

# ==================================================================

export JAVA_HOME="/usr/java/latest"

# discourage address map swapping by setting Xms and Xmx to the same value

# Increase maximum perm size for web base applications to 4x the default amount
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"

# Reset the default stack size for threads to a lower value (by 1/10th original)
# By default this can be anywhere between 512k -> 1024k depending on x32 or x64
# bit Java version.
# Note - JDK 7 on RHEL needs minimum -Xss256k

# Oracle Java as default, uses the serial garbage collector on the
# Full Tenured heap. The Young space is collected in parallel, but the
# Tenured is not. This means that at a time of load if a full collection
# event occurs, since the event is a 'stop-the-world' serial event then
# all application threads other than the garbage collector thread are
# taken off the CPU. This can have severe consequences if requests continue
# to accrue during these 'outage' periods. (specifically webservices, webapps)
# [Also enables adaptive sizing automatically]

# This is interpreted as a hint to the garbage collector that pause times
# of <nnn> milliseconds or less are desired. The garbage collector will
# adjust the Java heap size and other garbage collection related parameters
# in an attempt to keep garbage collection pauses shorter than <nnn> milliseconds.
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxGCPauseMillis=1500"

# A hint to the virtual machine that it.s desirable that not more than:
# 1 / (1 + GCTimeRation) of the application execution time be spent in
# the garbage collector.

# The hotspot server JVM has specific code-path optimizations
# which yield an approximate 10% gain over the client version.

# Disable remote (distributed) garbage collection by Java clients
# and remove ability for applications to call explicit GC collection
export CATALINA_OPTS="$CATALINA_OPTS -XX:+DisableExplicitGC"

# Uncomment to enable jconsole remote connection management.

# Check for application specific parameters at startup
if [ -r "$CATALINA_BASE/bin/" ]; then

echo "Using CATALINA_OPTS:"
for arg in $CATALINA_OPTS
echo ">> " $arg
echo ""

echo "Using JAVA_OPTS:"
for arg in $JAVA_OPTS
echo ">> " $arg
echo "_______________________________________________"
echo ""

Top of page

Table of Contents

Your comment

To leave a comment, please sign in.