You can use one of these monitoring systems
VisualVM - http://visualvm.java.net/
or
JConsole - http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html
Pergunta
Is there a tool/way to monitor the tomcat memory usage i.e. permgen to avoid getting issues like below. Yes we can increase the memory and trim up the GC, but still some monitoring would be nice. It would also be desireable to send warning emails when some critical memory consumption is reached.
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560)
at java.lang.Thread.run(Thread.java:662)
Solução
You can use one of these monitoring systems
VisualVM - http://visualvm.java.net/
or
JConsole - http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html
Outras dicas
You can turn on options to log JVM memory usage, then monitor the log file and send an email when permgen gets too high:
Edit catalina.sh and add -XX:+PrintHeapAtGC
and -Xloggc:$CATALINA_HOME/logs/gc.log
to CATALINA_OPTS
. See more info on setting Tomcat JVM options and on JVM GC logging options. The above assumes you've already set the $CATALINA_HOME
variable.
Monitor the log file and send an email when permgen gets too high. You could use a log monitoring tool like swatch to do this - see info on configuring swatch. Or you can write your own script to monitor the file, similar to this example, and invoke sendmail to send the email. With either of these options, you would need to write a regex to determine when permgen exceeds some threshold.