To our knowledge, JIRA does not have any memory leaks. We know of various public high-usage JIRA instances (eg. 40k issues, 100+ new issues/day, 22 pages/min in 750Mb of memory) that run for months without problems. When memory problems do occur, the following checklist can help you identify the cause.
Too little memory allocated?
Check the System Info page (see Increasing JIRA memory) after a period of sustained JIRA usage to determine how much memory is allocated.
0%
Checklist
handler
Set the minimum amount of memory (--JvmMs for the Windows service, -Xms otherwise)
1:n1891700346_p509926526Set the _minimum_ amount of memory (--JvmMs for the Windows service, -Xms otherwise)MEDIUM0false0falseamohdaris
Go to Admin -> System Info, and ensure that Total Memory is the minimum you set.
1:n1891700346_n1405758199Go to Admin -> System Info, and ensure that *Total Memory* is the minimum you set.MEDIUM0false0false
Too much memory allocated?
When increasing Java's memory allocation with -Xmx, please ensure that your system actually has the allocated amount of memory free. For example, if you have a server with 1Gb of RAM, most of it is probably taken up by the operating system, database and whatnot. Setting -Xmx1Gb to a Java process would be a very bad idea. Java would claim most of this memory from swap (disk), which would dramatically slow down everything on the server. If the system ran out of swap, you would get OutOfMemoryErrors.
If the server does not have much memory free, it is better to set -Xmx conservatively (eg. -Xmx256m), and only increase -Xmx when you actually see OutOfMemoryErrors. Java's memory management will work to keep within the limit, which is better than going into swap.
0%
Task List
handler
On Windows, ctrl-alt-del, and check the amount of memory marked "Available": !winmem.png|thumbnail!
1:p32_p941058248On Windows, ctrl-alt-del, and check the amount of memory marked \"Available\": !winmem.png|thumbnail!MEDIUM0false0falseamohdaris
handler
On Unix, cat /proc/meminfo or use top to determine free memory.
1:p32_n565781608On Unix, {{cat /proc/meminfo}} or use {{top}} to determine free memory.MEDIUM0false0falsemtaylor
handler
If JIRA is running, check there is spare available memory.
1:p32_p791511417If JIRA is running, check there is spare *available* memory.MEDIUM0false0false
handler
If raising a support request, please let us know the total system memory and (if on linux) the /proc/meminfo output.
1:p32_n275441669If raising a support request, please let us know the total system memory and (if on linux) the {{/proc/meminfo}} output.MEDIUM0false0false
Bugs in older JIRA versions
Please make sure you are using the latest version of JIRA. There are often memory leaks fixed in JIRA. Here are some recent ones:
Too many webapps (out of PermGen space)
People running multiple JSP-based web applications (eg. JIRA and Confluence) in one Java server are likely to see this error:
java.lang.OutOfMemoryError: PermGen space
Java reserves a fixed 64Mb block for loading class files, and with more than one webapp this is often exceeded. You can fix this by setting the -XX:MaxPermSize=128m property. See the Increasing JIRA memory page for details.
Tomcat memory leak
Tomcat caches JSP content. If JIRA is generating huge responses (eg. multi-megabyte Excel or RSS views), then these cached responses will quickly fill up memory and result in OutOfMemoryErrors.
In Tomcat 5.5.15+ there is a workaround – set the org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true property (see how). For earlier Tomcat versions, including that used in JIRA Standalone 3.6.x and earlier, there is no workaround. Please upgrade Tomcat, or switch to another app server.
0%
Task List
handler
Ensure you are using Tomcat 5.5.15 or above.
2:p32_n973653291Ensure you are using Tomcat 5.5.15 or above.MEDIUM0false0falsedyu
handler
On Unix, run {ps -ef | grep java} and make sure the LIMIT_BUFFER property is set.
2:p32_n719580611On Unix, run {ps -ef | grep java} and make sure the LIMIT_BUFFER property is set.MEDIUM0false0falseukuhnhardt
Other webapps
We strongly recommend running JIRA in its own JVM (app server instance), so that web applications cannot affect each other, and each can be restarted/upgraded separately. Usually this is achieved by running app servers behind Apache or IIS.
If you are getting OutOfMemoryErrors, separating the webapps should be your first action. It is virtually impossible to work out retroactively which webapp is consuming all the memory.
0%
Task List
handler
Check which webapps are running (eg. look in /webapps in Tomcat, and/or check the logs for indications of what is running.
3:p32_p1956214575Check which webapps are running (eg. look in {{/webapps}} in Tomcat, and/or check the logs for indications of what is running.MEDIUM0false0false
handler
If raising a support request, please attach all the log files (eg. logs/* in Tomcat).
3:p32_p316977127If raising a support request, please attach all the log files (eg. {{logs/\\* in Tomcat}}).MEDIUM0false0false
Plugins
Plugins are a frequent cause of memory problems. If you have any third-party plugins in use, try disabling them temporarily. The same applies to Atlassian plugins such as the toolkit, charting and calendar plugins.
0%
Task List
handler
Get a directory listing of the WEB-INF/lib directory, and check for *-plugin*.jar files.
4:p32_n1045218725Get a directory listing of the {{WEB-INF/lib}} directory, and check for {{\\*-plugin*.jar}} files.MEDIUM0false0false
handler
Disable the plugin in the Administration page and remove the jar file from the WEB-INF/lib directory.
4:p32_n1210810504Disable the plugin in the Administration page and remove the jar file from the {{WEB-INF/lib}} directory.MEDIUM0false0false
handler
If raising a support request, please include this directory listing in the issue.
4:p32_p1285250499If raising a support request, please include this directory listing in the issue.MEDIUM0false0false
Millions of notificationinstance records
In order to correctly 'thread' email notifications in mail browsers, JIRA tracks the Message-Id header of mails it sends. In heavily used systems, the notificationinstance table can become huge, with millions of records. This can cause OutOfMemoryErrors in the JDBC driver when it is asked to generate an XML export of the data (see JRA-11725)
0%
Task List
handler
Run the SQL select count(*) from notificationinstance;. If you have over (say) 500,000 records, delete the old ones with {{delete from notificationinstance where id < }}{pick an id halfway}.
5:p32_p965488490Run the SQL {{select count\\(*) from notificationinstance;}}. If you have over (say) 500,000 records, delete the old ones with {{delete from notificationinstance where id < }}{pick an id halfway}.MEDIUM0false0false
Services (custom, CVS, etc)
Occasionally people write their own services, which can cause memory problem if (as is often the case) they iterate over large numbers of issues. If you have any custom services, please try disabling them for a while to eliminate them as a cause of problems.
The CVS service sometimes causes memory problems, if used with a huge CVS repository (in this case, simply increase the allocated memory).
A symptom of a CVS (or general services-related) problem is that JIRA will run out of memory just minutes after startup.
0%
Task List
handler
Go to Admin -> Services
6:p32_n502462929Go to Admin \\-> ServicesMEDIUM0false0false
handler
Check for any services other than the usual (backup, mail queue}.
6:p32_p1269487514Check for any services other than the usual (backup, mail queue}.MEDIUM0false0false
handler
If raising a support request, please cut & paste your services list into the issue.
6:p32_n708218535If raising a support request, please cut & paste your services list into the issue.MEDIUM0false0false
JIRA backup service with large numbers of issues.
Do you have hundreds of thousands of issues? Is JIRA's built-in backup service running frequently? If so, please switch to a native backup tool and disable the JIRA backup service, which will be taking a lot of CPU and memory to generate backups that are unreliable anyway (due to lack of locking). See the JIRA backups documentation for details.
0%
Task List
handler
Check the total issue count in Admin -> System Info
7:p32_p1214299771Check the total issue count in Admin \\-> System InfoMEDIUM0false0false
handler
Go to Admin -> Services
7:p32_n502462929Go to Admin \\-> ServicesMEDIUM0false0false
handler
Check if a backup service is configured and note its frequency.
7:p32_p656105028Check if a backup service is configured and note its frequency.MEDIUM0false0false
JIRA mail misconfiguration causing comment loops.
Does a user have an e-mail address that is the same as one of the mail accounts in your mail handler services? This can cause a comment loop where notifications are sent out and appended to the issue which then triggers another notification and so forth. If a user then views that issue, it could consume a lot of memory. You can query your database using this query that will show you issues with more than 50 comments. It could be normal for issues that have 50 comments, you want to spot for any irregular pattern in the comments themselves such as repeating notifications.
SELECT count(*) as commentcount, issueid from jiraaction group by issueid having commentcount > 50 order by commentcount desc
Ensure no locally run SOAP clients use getProjects.
8:p32_n188166102Ensure no locally run SOAP clients use {{getProjects}}.MEDIUM0false0false
handler
As below - enable and check access logs.
8:p32_p1095899377As below - enable and check access logs.MEDIUM0false0false
Eclipse Mylyn plugin
If your developers use the Eclipse Mylyn plugin, make sure they are using the latest version. The Mylyn bundled with Eclipse 3.3 (2.0.0.v20070627-1400) uses the getProjects method, causing problems as described above.
0%
Task List
handler
As below - enable access logging and ensure the latest Mylyn plugin is used.
9:p32_p1845925788As below - enable access logging and ensure the latest Mylyn plugin is used.MEDIUM0false0falsetchin
Huge XML/RSS or SOAP requests
This applies particularly to publicly visible JIRAs. Sometimes a crawler can slow down JIRA by making multiple huge requests. Every now and then someone misconfigures their RSS reader to request XML for every issue in the system, and sets it running once a minute. Similarly, people sometimes write SOAP clients without consideration of the performance impact, and set it running automatically. JIRA might survive these (although be oddly slow), but then run out of memory when a legitimate user's large Excel view pushes it over the limit.
The best way to diagnose unusual requests is to enable Tomcat access logging (on by default in JIRA Standalone), and look for requests that take a long time.
In JIRA 3.10 there is a jira.search.views.max.limit property you can set in WEB-INF/classes/jira-application.properties, which is a hard limit on the number of search results returned. It is a good idea to enable this for sites subject to crawler traffic.
0%
Task List
handler
Turn on access logging to see if SOAP requests are being made.
10:p32_n1525833857Turn on [access logging|http://confluence.atlassian.com/display/JIRA/User+access+logging] to see if SOAP requests are being made.MEDIUM0false0false
handler
Check your access logs for long-running or repeated requests.
10:p32_p795145552Check your access logs for long-running or repeated requests.MEDIUM0false0false
Unusual JIRA usage
Every now and then someone reports memory problems, and after much investigation we discover they have 3,000 custom fields, or are parsing 100Mb emails, or have in some other way used JIRA in unexpected ways. Please be aware of where your JIRA installation deviates from typical usage.
0%
Task List
handler
If raising a support request, cut & paste the System Info output, which include basic usage stats.
11:p32_p525627646If raising a support request, cut & paste the System Info output, which include basic usage stats.MEDIUM0false0false
handler
Better yet, please attach a JIRA backup of your data (optionally anonymized) so we can replicate the problem.
11:p32_p940933811Better yet, please attach a JIRA backup of your data (optionally [anonymized|http://confluence.atlassian.com/display/JIRA/Anonymizing+data]) so we can replicate the problem.MEDIUM0false0false
handler
Turn on access logging to see how JIRA is being used. If submitting a support request, please submit this log too.
11:p32_p1539152675Turn on [access logging|#accesslogs] to see how JIRA is being used. If submitting a support request, please submit this log too.MEDIUM0false0false
Memory diagnostics
If you have been through the list above, there are a few further diagnostics which may provide clues.
Getting memory dumps
By far the most powerful and effective way of identifying memory problems is to have JIRA dump the contents of its memory on exit (when exiting due to an OutOfMemoryError hang). These run with no noticeable performance impact. This can be done in one of two ways:
On Sun's JDK 1.5.0_07 and above, or 1.4.2_12 and above, set the -XX:+HeapDumpOnOutOfMemoryError option. If JIRA runs out of memory, it will create a jira_pid*.hprof file containing the memory dump in the directory you started JIRA from.
On other platforms, you can use the yourkit profiler agent. Yourkit can take memory snapshots when when the JVM exits, or when an OutOfMemoryError is imminent (eg. 95% memory used), or when manually triggered. The agent part of Yourkit is freely redistributable. For more information, see Profiling Memory and CPU usage with YourKit.
Please reduce your maximum heap size (-Xmx) to 750m or so, so that the generated heap dump is of manageable size. You can turn -Xmx up once a heap dump has been taken.
This can be parsed with tools like gcviewer to get an overall picture of memory use:
To enable gc logging, start JIRA with the option -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -verbose:gc -Xloggc:gc.log. Replace gc.log with an absolute path to a gc.log file.
If you modify bin/setenv.sh, you will need to restart JIRA for the changes to take effect.
Access logs
It is important to know what requests are being made, so unusual usage can be identified. For instance, perhaps someone has configured their RSS reader to request a 10Mb RSS file once a minute, and this is killing JIRA.
If you are using Tomcat, access logging can be enabled by adding the following to conf/server.xml, below the </Host> tag:
The %S logs the session ID, allowing requests from distinct users to be grouped. The %D logs the request time in milliseconds. Logs will appear in logs/access_log.<date>, and look like this:
Alternatively, or if you are not using Tomcat or can't modify the app server config, JIRA has a built-in user access logging which can be enabled from the admin section, and produces terser logs like:
2006-09-27 10:35:50,561 INFO [jira.web.filters.AccessLogFilter] bob http://localhost:8080/secure/IssueNavigator.jspa 102065-4979 1266
2006-09-27 10:35:58,002 INFO [jira.web.filters.AccessLogFilter] bob http://localhost:8080/secure/IssueNavigator.jspa 102806-4402 1035
2006-09-27 10:36:05,774 INFO [jira.web.filters.AccessLogFilter] bob http://localhost:8080/browse/EAO-2 97058+3717 1730
Thread dumps
If JIRA has hung with an OutOfMemoryError, the currently running threads often point to the culprit. Please take a thread dump of the JVM, and send us the logs containing it.
Add Comment