【问题标题】:Tomcat6 problems and PermGen spaceTomcat6问题和PermGen空间
【发布时间】:2014-06-21 12:05:25
【问题描述】:

在生产服务器中部署我的应用时,我正在尝试一些问题。

我有一台用于开发的 ubuntu 机器,我的 servlet 在其中运行良好。一个月左右没有问题。

然后我将它部署到我的生产机器(VM debian)。我停止了tomcat,我将war文件复制到webapps文件夹并再次启动tomcat。

首先,当我尝试停止/启动/重启 tomcat 时,我得到了这个“错误”:

root@VMMachine-34199:~/folder# sudo /etc/init.d/tomcat6  restart
[ ok ] Stopping Tomcat servlet engine: tomcat6 Tomcat servlet engine is not running but pid file exists, cleaning up.
[ ok ] Starting Tomcat servlet engine: tomcat6.
root@VMMachine-34199:~/folder# sudo /etc/init.d/tomcat6  status
[ ok ] Tomcat servlet engine is running with pid 22627.
root@VMMachine-34199:~/folder# sudo /etc/init.d/tomcat6  status
[ ok ] Tomcat servlet engine is not running, but pid file exists..

我不知道该怎么做才能避免这种情况。总是发生在生产机器上。

之后,我又遇到了这个问题,不知道是不是和第一个有关。

在 catalina.out 我得到:

java.net.BindException: Address already in use <null>:9010 

9010 是 tomcat 端口。此端口仅用于通过我拥有的其他服务连接到我部署的一场战争。使用 netstat -atnp |grep 9010 我只看到其他服务 LISTEN。

但在此之后,tomcat 似乎启动了,在我的 servlet 中注册了两个可用的资源,依此类推。

最后,我在 catalina.out 中得到了这个:

May 05, 2014 8:34:29 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/var/lib/tomcat6/webapps/SERVLET/WEB-INF/lib/servlet-api-2.3.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class:   javax/servlet/Servlet.class
May 05, 2014 8:34:47 AM org.apache.tomcat.util.digester.Digester endElement
SEVERE: End event threw error
java.lang.OutOfMemoryError: PermGen space

May 05, 2014 8:34:47 AM org.apache.tomcat.util.modeler.Registry registerComponent
SEVERE: Null component Catalina:type=JspMonitor,name=jsp,WebModule=//localhost/SERVLET,J2EEApplication=none,J2EEServer=none
May 05, 2014 8:34:47 AM org.apache.catalina.startup.HostConfig deployDirectory
SEVERE: Error deploying web application directory SERVLET
java.lang.OutOfMemoryError: PermGen space

正如我已经说过的,在开发机器中,tomcat 工作正常并且从未给我这些错误,所以我不知道如何处理它们。

我正在使用这个库 Log4j 。我在这里读到:http://javarevisited.blogspot.com.es/2012/01/tomcat-javalangoutofmemoryerror-permgen.html 会导致 Permgem 错误。不知道能不能帮助你解决我的问题

现在我在启动时得到这个并且它停止了:

2014 年 5 月 5 日上午 8:42:17 org.apache.coyote.http11.Http11Protocol pause 信息:在 http-9010 上暂停 Coyote HTTP/1.1 2014 年 5 月 5 日上午 8:42:18 org.apache.catalina.core.StandardService 停止 信息:停止服务 Catalina 2014 年 5 月 5 日上午 8:42:18 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [/SERVLET] 似乎已经启动了一个名为 [Timer-0] 的线程,但未能停止它。这很可能造成内存泄漏。 2014 年 5 月 5 日上午 8:42:18 org.apache.coyote.http11.Http11Protocol 销毁 信息:在 http-9010 上停止 Coyote HTTP/1.1

【问题讨论】:

    标签: java servlets tomcat6 permgen


    【解决方案1】:

    尝试增加生产服务器上 VM 的 PermGen 大小(它是 JVM 保留类中的一个内存区域以及其他一些保证不会更改且很少需要进行垃圾回收的常量)。

    请参阅Increase PermGen Space 问题。

    【讨论】:

    • 我试着用这条线来做:export JAVA_OPTS="-Xms1024m -Xmx10246m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"我将它添加到 catalina.sh 中可用的最后一行,但错误仍然存​​在。
    • 好的。你能用 jconsole 连接到 JVM 并检查 JVM 实际有哪些选项吗?
    • 如何使用 jconsole 连接到 JVM?我想我删除了一些必要的东西。现在它没有启动我的 servlet。我得到 SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。我现在会在 JVM 控制台之前检查一下
    【解决方案2】:

    关闭服务以验证或更改服务或 tomcat 的端口。 尝试增加 jvm 内存检查这个链接 Increase permgen space 如果 ubuntu 64 位操作系统,请尝试更改为 64 位 JVM。 可能是应用程序 jar 变大。如果未使用或不必要,请减少使用的应用程序 jar。 获取转储并验证哪个线程失败。

    【讨论】:

    • 我正在对未使用的罐子进行深入清洁。我会在我完成后告诉你,看看我是否得到了什么。
    【解决方案3】:

    你怎么“我停止了 tomcat”?

    我总是

    kill -9 ${pid} 
    

    但不使用

    ${tomcat_home}/bin/shutdown.sh .
    

    使用 shutdown.sh 脚本时出现问题。

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 2011-07-27
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2011-09-04
      • 2013-03-08
      相关资源
      最近更新 更多