监控tomcat permgen

时间:2013-11-20 15:33:56

标签: java tomcat7 out-of-memory permgen

是否有工具/方法来监控tomcat内存使用情况,即permgen,以避免出现如下问题。是的,我们可以增加内存并修剪GC,但仍然可以进行一些监控。当达到一些关键的内存消耗时,也希望发送警告电子邮件。

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)

2 个答案:

答案 0 :(得分:1)

您可以使用其中一个监控系统

VisualVM - http://visualvm.java.net/

JConsole - http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html

答案 1 :(得分:1)

您可以打开选项以记录JVM内存使用情况,然后监控日志文件并在permgen过高时发送电子邮件:

  1. 修改catalina.sh并将-XX:+PrintHeapAtGC-Xloggc:$CATALINA_HOME/logs/gc.log添加到CATALINA_OPTS。查看有关设置Tomcat JVM optionsJVM GC logging选项的详细信息。以上假设您已经设置了$CATALINA_HOME变量。

  2. 监控日志文件,并在permgen过高时发送电子邮件。您可以使用swatch等日志监控工具执行此操作 - 请参阅configuring swatch上的信息。或者您可以编写自己的脚本来监视文件,类似于this example,并调用sendmail来发送电子邮件。使用这些选项中的任何一个,您都需要编写一个正则表达式来确定permgen何时超过某个阈值。