Tomcat6问题和PermGen空间

时间:2014-05-05 08:37:52

标签: java servlets tomcat6 permgen

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

我有一台用于开发的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暂停 信息:在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

3 个答案:

答案 0 :(得分:0)

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

请参阅Increase PermGen Space问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您如何“我停止了tomcat”?

我总是

function overwrite_error_log() {
  ini_set( 'error_log', '/dev/stdout' ); // phpcs:ignore
}

add_action( 'init', 'overwrite_error_log', 10 );

但不使用

kill -9 ${pid} 

使用shutdown.sh脚本存在问题。