为什么JSF在Tomcat 7中抛出OutOfMemoryError?

时间:2012-11-07 01:28:27

标签: jsf-2 tomcat7

当我从WEB-INF / lib中删除JSF jar(jsf-api-2.0.1.jar和jsp-impl-2.0.1.jar)时,我的Windows机器中准备了一个干净整洁的Tomcat7,我遇到了这个错误:

Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    ... 10 more

当我把2个罐子放在WEB-INF / lib中时,我遇到了错误:

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

在Tomcat 7中运行JSF的任何线索?

1 个答案:

答案 0 :(得分:2)

您尚未指出在部署或一段时间后是否立即发生错误。如果它在一段时间后发生,即在您的应用程序运行期间,您的代码将受到责备。看看这个excellent article,它将帮助您使用JDK 6跟踪错误来源。

PermGen错误表示与应用程序容器有关的类加载问题。永久生成(简称PermGen)是JVM存储对象(如类和字符串文字)的区域。通常,垃圾收集器不应该在这里频繁操作。一旦Web应用程序的类加载器(每个已部署的webapp有一个)不再使用,应自动清除应用服务器加载的类。 Tomcat过去曾给我这方面的问题(特别是在Netbeans中使用时)。经过反复重新调配,它似乎无法有效地清理。除了增加permgen空间的大小之外,你还可以做一些事情

1)您可以将在该tomcat实例中运行的Web应用程序的公共jar移动到TOMCAT_HOME/lib。这样,您可以期望每个需要Web应用程序不会多次加载您的类库,这是tomcat的默认行为(请参阅this)。但是要小心使用此选项;如果您最终部署包含较新版本jar的Web应用程序,则可能会遇到NoClassDefFound错误。

2)您可以尝试使用此-XX:MaxPermGen代替(或除此之外)mxtong在其文章中提出的-XX:MaxPermSize

另请参阅this question and it's answers了解更多步骤

相关问题