This page discusses various memory issues. In a nutshell - if your computer has less than 128MB of ram - you will probably have trouble. Anyhow, also read the following threads for other memory related issues:
- Memory requirements
- java.lang.OutOfMemoryError during deploy
- Memory requirementsMemory Mgmt Tomcat
TODO: Links above no longer work - need to pull them from other mailing list archive if they are correct
If your application uses JSPs which are frequently recompiled at runtime, e.g. headers that change value hourly, please make sure to read the JSP HOW-TO page and RELEASE NOTES documents. You may wish to tune the JSP compiler configuration to prevent memory leaks. Of course, these are documents you should have read by now anyways..
How do I adjust memory settings?
First look at
java -X to determine what parameters to set. Then you can set them via the environment variable
JAVACATALINA_OPTS. Read a comment at the top of the files
catalina.sh for more information on
Note that there also exists environment variable
JAVA_OPTS, but it should not be used to set the memory settings. The difference is that
JAVA_OPTS settings are used for all Tomcat management commands. When you stop Apache Tomcat (using
catalina.sh stop command), a small short-lived Java process is created that notifies the main Java process of Tomcat that it has to shut down. This small Java process does not need the same memory settings as the main process. The small process uses the settings from
JAVA_OPTS. The main process uses the settings from both
If you launch Tomcat in any other way that does not use
catalina.sh to prepare a command line for Java (e.g. you launch java directly from within an IDE, or you use a Service Wrapper to run Tomcat as a service on Windows), see their options on how to provide settings for the java executable. E.g. Apache Commons Daemon service wrapper for Windows has a GUI configuration dialog that can be opened by running
tomcat9w.exe or a similar command.
Why do I get
- You're out of memory. Simple as that - add more to your heap.
- You're out of memory. You have code which is hanging onto object references and the garbage collector can't do its job. Get a profiler to debug this one.
- You ran out of file descriptors. If you are on a *nix system, it has been observed that an
OutOfMemoryErrorcan be thrown if you run out of file descriptors. This can occur if your threshold is too low. The
ulimitprogram can help you out here. You also may need to account for socket connections too when thinking about these thresholds. Google is your friend for getting more information about this topic.
- You have too many threads running. Some OS's have a limit to the number of threads which may be executed by a single process. (Which is what the JVM is.) Refer to your OS docs for more information on how to raise this threshold.
- If you have a lot of servlets or JSP's, you may need to increase your permanent generation. By default, it is 64MB. Doubling it to be
-XX:MaxPermSize=256mmight be a good start.
- Your OS limits the amount of memory your process may take. OK, this one is grasping at straws.
- Not actually a reason - but on your particular platform, look at the
java -Xoptions. They may be VERY helpful.
How much memory is Tomcat/webapp/??? using?
- To find out how much memory Tomcat is using, you might be able to use the
Runtimeclass provided by the JDK.
- You can't find out how much memory a webapp is using. The JVM doesn't give us these detail.
- You can't find out how much memory a ??? is using. The JVM doesn't give us these detail.
- That being said, a memory profiling tool might prove the above statements wrong - but you probably don't want to use them in a production environment.