6

我有一个 tomcat 6.0.20,apr 1.2,jdk 1.6.0_15,mysql 5.1.38 在 4 GB ram 的 rhel 盒子上运行。上面有一个简单的 jsp/servlet 应用程序,有 5 个用户,一个 struts 1.2.0.9 有 64 个用户,一个 struts 2.0 应用程序有 35 个用户。struts 2.0 用户每秒输入一个条目,一天大约有 900 个条目。我还在最后两个应用程序中使用 toplink 进行持久性。我已在代码中将所有非引用对象声明为 null,并为来自 struts 2 站点和 tomcat 站点的配置文件应用了生产值。在mysql中应用线程缓存,将wait_timeout和interactive_timeout减少到相当于tomcat的会话超时。增加了linux中的文件描述符。重做查询。检查线程转储,查看 gc 统计信息,在此基础上应用上述更改,

YET 仍然面临“java.lang.OutOfMemoryError”错误。

在不同的时间它用于不同的事物,有时它的 Servlet.service(),有时它的 image.servlet,有时它导致它的 jasper。

非常令人沮丧,因为错误不是恒定的,而是随着时间的推移不断变化

任何帮助,将不胜感激!!!

JAVA_OPTS=-server -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSParallelRemarkEnabled (tomcat manager 报告 34 mb empty 所以没有使用 permsize, mx 和 mn 等)

持久性.xml

 <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/dbname?autoReconnect=false"/>

服务器.xml

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" compression="on" compressableMimeType="application/octet-stream,text/html,text/xml,text/plain,application/x-javascript,image/gif,text/css,image/gif,application/vnd.ms-excel,application/pdf" enableLookups="false"/>

上下文.xml

<Context reloadable="false" delegate="false" privileged="false">
4

4 回答 4

5

首先,您必须确定哪个进程正在吃掉所有的 CPU。真的是java程序吗?如果您还没有,请尝试top(1)弄清楚这一点。

如果您有并且确定它是 Java 程序,请启用远程调试。下次 CPU 沸腾时,连接并确保没有线程处于无限循环中。

如果不是这种情况,则说明您内存不足(无论 tomcat 管理器怎么说)。启动JMX 控制台并检查各种内存空间。我的猜测是 permgen 已经满了(你的类路径上有很多大 JAR 吗?或者你在某个地方使用 cglib 吗?)当这种情况发生时(并且因为你启用了 perm gen GC),Java VM 将尝试释放内存永远的烫发空间。

除非您使用在运行时创建类文件的东西(例如,像 Groovy 这样的脚本语言),否则这将不起作用:在普通 Java 程序中,类永远不会被 GC'd。如果您仍然这样做,GC 将运行并运行,除了消耗所有 CPU 功率之外什么也没有。

于 2009-10-09T08:21:23.940 回答
1

也许这与12解决的问题相同。尝试只创建小交易。

于 2010-04-22T07:33:58.310 回答
0

你的问题是你有这样的代码:

       new Thread(){
          public void run(){
             //something
          }
       }.start();

反过来,它每次都会在 Tomcat 的缓存中创建新的类定义文件——这会占用空间,所以你有 PermGenSpace 异常......

重写一些关键类,不要“即时”创建自定义类,创建单独的内部类,事情会改变......

      class MyJobDoer extends Thread{
          public void run(){
             //something
          }
       }

      MyJobDoer mjd=new MyJobDoer();
      mjd.start();
于 2009-10-09T10:53:51.450 回答
0

我建议使用 jstat 来监控 tomcat 的内存和垃圾收集模式。

你说你正面临 perm gen 错误,但没有增加 perm gen 的数量。重新加载 tomcat 应用程序可能会导致 perm gen 泄漏,但您可能会在打开所有页面之前观察您的使用情况,从而导致将更多类加载到 perm gen 中。

于 2009-10-09T08:25:09.387 回答