Error Java Heap Space

Hi, I’m getting this error ’ Java Heap Space’, I have Ignition in a computer with 16gb ram and the DB separetly on another computer, I have 2 multi monitor clients on 4 monitors each. Sometimes works for a fews hours then I get that error in one of the clients.
This is my ignition.conf

#encoding=UTF-8
# Configuration files must begin with a line specifying the encoding
#  of the the file.

#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
#  License Key to start.  Licenses can be purchased or a trial license
#  requested on the following pages:
# http://wrapper.tanukisoftware.com/purchase
# http://wrapper.tanukisoftware.com/trial

# Include file problems can be debugged by removing the first '#'
#  from the following line:
##include.debug

# The Wrapper will look for either of the following optional files for a
#  valid License Key.  License Key properties can optionally be included
#  directly in this configuration file.
#include ./wrapper-license.conf

# The following property will output information about which License Key(s)
#  are being found, and can aid in resolving any licensing problems.
#wrapper.license.debug=TRUE

#********************************************************************
# Wrapper Localization
#********************************************************************
# Specify the locale which the Wrapper should use.  By default the system
#  locale is used.
#wrapper.lang=en_US # en_US or ja_JP

# Specify the location of the Wrapper's language resources.  If these are
#  missing, the Wrapper will default to the en_US locale.
wrapper.lang.folder=../lang

#********************************************************************
# Wrapper Java Properties
#********************************************************************
# Java Application
#  Locate the java binary on the system PATH:
wrapper.java.command=
#  Specify a specific java binary:
#set.JAVA_HOME=/java/path
#wrapper.java.command=

# Tell the Wrapper to log the full generated Java command line.
#wrapper.java.command.loglevel=INFO

# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
wrapper.java.classpath.1=lib/wrapper.jar
wrapper.java.classpath.2=lib/catapult.jar

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=lib

# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE

# Java Additional Parameters
#wrapper.java.additional.1=-XX:PermSize=3076m
#wrapper.java.additional.2=-XX:MaxPermSize=4096m
wrapper.java.additional.1=-XX:+UseG1GC
wrapper.java.additional.2=-XX:MaxGCPauseMillis=100
#wrapper.java.additional.4=-Xincgc
wrapper.java.additional.3=-Xloggc:"C:/Program Files/Inductive Automation/Ignition/logs/javagc-%WRAPPER_TIME_YYYYMMDDHHIISS%.log"
#wrapper.java.additional.4=-XX:+CMSClassUnloadingEnabled
#wrapper.java.additional.5=-XX:+CMSPermGenSweepingEnabled
wrapper.java.additional.4=-Ddata.dir="C:/Program Files/Inductive Automation/Ignition/data"
wrapper.java.additional.5=-Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false
#wrapper.java.additional.8=-Xdebug
#wrapper.java.additional.9=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
wrapper.java.additional.6=-XX:+PrintGCDetails
wrapper.java.additional.7=-XX:+PrintGCTimeStamps
wrapper.java.additional.8=-XX:+PrintGCDateStamps
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=1024
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=3072

# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=com.inductiveautomation.catapult.Catapult

wrapper.shutdown.timeout=120
wrapper.jvm_exit.timeout=120

# Set this value to TRUE to allow ignition.conf to be reloaded when the JVM is restarted
wrapper.restart.reload_configuration=TRUE

#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Enables Debug output from the Wrapper.
# wrapper.debug=TRUE

# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

# Log file to use for wrapper output logging.
wrapper.logfile=logs/wrapper.log

# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM

# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO

# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=10m

# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=5

# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE

#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE

# Title to use when running as a console
wrapper.console.title=Ignition Gateway

#********************************************************************
# Wrapper JVM Checks
#********************************************************************
# Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
#wrapper.check.deadlock=TRUE
#wrapper.check.deadlock.interval=60
#wrapper.check.deadlock.action=RESTART
#wrapper.check.deadlock.output=FULL

# Out Of Memory detection.
#wrapper.filter.trigger.1000=java.lang.OutOfMemoryError
#wrapper.filter.action.1000=RESTART
#wrapper.filter.message.1000=The JVM has run out of memory.

wrapper.on_exit.default=SHUTDOWN
wrapper.on_exit.2=RESTART

#********************************************************************
# Wrapper Email Notifications. (Requires Professional Edition)
#********************************************************************
# Common Event Email settings.
#wrapper.event.default.email.debug=TRUE
#wrapper.event.default.email.smtp.host=<SMTP_Host>
#wrapper.event.default.email.smtp.port=25
#wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
#wrapper.event.default.email.sender=<Sender email>
#wrapper.event.default.email.recipient=<Recipient email>

# Configure the log attached to event emails.
#wrapper.event.default.email.attach_log=TRUE
#wrapper.event.default.email.maillog.lines=50
#wrapper.event.default.email.maillog.format=LPTM
#wrapper.event.default.email.maillog.loglevel=INFO

# Enable specific event emails.
#wrapper.event.wrapper_start.email=TRUE
#wrapper.event.jvm_prelaunch.email=TRUE
#wrapper.event.jvm_start.email=TRUE
#wrapper.event.jvm_started.email=TRUE
#wrapper.event.jvm_deadlock.email=TRUE
#wrapper.event.jvm_stop.email=TRUE
#wrapper.event.jvm_stopped.email=TRUE
#wrapper.event.jvm_restart.email=TRUE
#wrapper.event.jvm_failed_invocation.email=TRUE
#wrapper.event.jvm_max_failed_invocations.email=TRUE
#wrapper.event.jvm_kill.email=TRUE
#wrapper.event.jvm_killed.email=TRUE
#wrapper.event.jvm_unexpected_exit.email=TRUE
#wrapper.event.wrapper_stop.email=TRUE

# Specify custom mail content
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n

#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.

# Name of the service
wrapper.name=Ignition

# Display name of the service
wrapper.displayname=Ignition Gateway

# Description of the service
wrapper.description=Ignition Gateway

# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=

# Mode in which the service is installed.  AUTO_START, DELAY_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START

# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false

#VERSION - DO NOT MODIFY: 10


If I change this setting, can this resolve my problem?

Well, you’ve set the gateway’s maxmemory to 3G in ignition.conf, so it doesn’t much matter that the server it’s on has 16G.

Does the client memory have something to do with the maximum amount of memory in the gateway?

No. Look at wrapper.java.maxmemory in your ignition.conf. That is the gateway service’s memory limit.

More active clients equal to more ram usage for the gateway? I currenty have 8 active clients, 3gb of ram is to low? If I change this to 8gb of ram will this resolve the java heap space error?

Initial Java Heap Size (in MB)

wrapper.java.initmemory=1024

Maximum Java Heap Size (in MB)

wrapper.java.maxmemory=8192

EDIT: There are 2 multi monitor clients, four monitors each.

Where are you seeing the heap space error? In the gateway logs or on the clients?

I have two computers and each launch 4 clients in four monitors. The second computer sometimes just launch 2 or 3 clients and show the error.

EDIT:
There are only 2 multi monitor clients

Okay, well you should be changing the memory settings in the Project Properties dialog then, not the Ignition Gateway config.

Try setting your clients to launch with 512mb max.

Do I need to restart the gateway for the changes to be made?

You might need to re-download the JNLP and relaunch the clients.

However… I think I may have misunderstood your problem. If you’re getting this error before the clients even launch then your computer that you’re running the clients on probably doesn’t have enough memory, and increasing the max may just make things worse.

1 Like

Not much, no. Unless it is a mobile client, which really runs in the gateway.

Can you use the multi-desktop features of 7.9 to run all screens from a single client? That’ll save a bunch of memory.

Yeah, I misunderstood, too. Jumped to conclusions based on the posted ignition.conf. /-:

2 Likes

I second the multiple desktop suggestion. Multiple clients are slower to open and use more resources.

1 Like

I’m using this client startup script to open in multiple monitors.

# Get the screen information for all of your monitors.
# The getScreens() function returns a dataset of the index (0 based), width, and height for each monitor.
screensDataset = system.gui.getScreens()
	    			  
# Open the first window of the project in the (current) primary monitor.
screenIndex = screensDataset[0][0]
monitorNum = screenIndex + 1
primaryScreenText = 'This is Monitor %d' %monitorNum
system.nav.swapTo('Menu Superior', {'Pantalla':"LINEA 1"})
system.nav.swapTo('PANTALLAS/LINEA 1')

for screenDetails in screensDataset[1:]:
	    # unpacks the tuple that is returned for each of the monitors present. Consists of screen index, width, and height of the screen.
	    screenIndex, screenWidth, screenHeight = screenDetails
	    monitorNum = screenIndex + 1
	    screenText = "This is Monitor %d" %monitorNum
	  
	    # Open an empty frame on the next monitor.
	    # Assign a handle and apply the width/height for the monitor you are opening on
	    handleName = "Monitor %d" %monitorNum
	    system.gui.openDesktop(screen=screenIndex, handle=handleName, width=screenWidth, height=screenHeight)
	  
	    # Open the Main Window on this new desktop and pass the parameters needed.
	    if monitorNum == 2:
	    	system.nav.desktop(handleName).swapTo('Menu Superior',{'Pantalla':"LINEA 2"})
	    	system.nav.desktop(handleName).swapTo('Menu Inferior')
	    	system.nav.desktop(handleName).swapTo('PANTALLAS/LINEA 2')
	    if monitorNum == 3:
	    		system.nav.desktop(handleName).swapTo('Menu Superior',{'Pantalla':"CONTROL RAPIDO 1"})
	    		system.nav.desktop(handleName).swapTo('Menu Inferior')
	    		system.nav.desktop(handleName).swapTo('PANTALLAS/CONTROL RAPIDO 1')
	    if monitorNum == 4:
	    			system.nav.desktop(handleName).swapTo('Menu Superior',{'Pantalla':"SECADOR BIOMASA"})
	    			system.nav.desktop(handleName).swapTo('Menu Inferior')
	    			system.nav.desktop(handleName).swapTo('PANTALLAS/SECADOR BIOMASA')

Ah, so you are already using one client for all screens. You should set that project’s client max memory property to a large fraction of the RAM available on the client computer. After you do so, you should use the client diagnostics window to track its internal memory usage. Use the memory consumption after a minute or two, plus a bit extra, to set the project’s client startup memory property.

1 Like

I’m going to test this configuration and tell you how it’s going