说        明:小弟从事的项目 架构为 tomcat(5.0.30)+struts(1.0)+oracle(9),在tomcat下的应用为6个应用,5个客户同时在线大约100人(即共500人)。1个应用同时可能为10人
已采用的方法:修改了tomcat的初始内存的大小为1024m 和几乎把所有的公共类包 放到了tomcat的Tomcat 5.5\common\lib下
服  务   器: 采用sun公司性能不错的480  8g的内存 
操 作 系 统:solaris9
现       象:是内存溢出!
现 象 频 率:不到一周也就 5天
现 象 内 容:
    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Servlet execution threw an exception
com.ezcross.cmhk.oa.filter.SetCharacterEncodingFilter.doFilter(Unknown Source)
root cause java.lang.OutOfMemoryError: unable to create new native thread
java.lang.Thread.start0(Native Method)
java.lang.Thread.start(Thread.java:574)
java.lang.ref.Finalizer$1.run(Finalizer.java:113)
java.security.AccessController.doPrivileged(Native Method)
java.lang.ref.Finalizer.forkSecondaryFinalizer(Finalizer.java:121)
java.lang.ref.Finalizer.runFinalization(Finalizer.java:126)
java.lang.Runtime.runFinalization0(Native Method)
java.lang.Runtime.runFinalization(Runtime.java:686)
com.ezcross.rdas.client.DataAccess.closeSession(Unknown Source)
com.ezcross.util.SMS10_ServCommon.closeDbAccess(Unknown Source)
com.ezcross.cmhk.oa.db.portal.interfaces.ora.OADuBanPortalIF_ORA.classSelect(Unknown Source)
com.ezcross.cmhk.oa.db.portal.interfaces.ora.OADuBanPortalIF_ORA.OAMainPage_SMSSelect(Unknown Source)
com.ezcross.cmhk.oa.db.portal.IndexDataBO.setOa_Duban(Unknown Source)
com.ezcross.cmhk.oa.action.portal.IndexAction.setEntityData(Unknown Source)
com.ezcross.cmhk.oa.action.portal.IndexAction.doExecute(Unknown Source)
com.ezcross.cmhk.oa.util.base.OaBaseAction.execute(Unknown Source)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.ezcross.cmhk.oa.filter.SetCharacterEncodingFilter.doFilter(Unknown Source)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.30 logs.

解决方案 »

  1.   

    85%是数据访问层代码问题,和硬件无关closeSession(Unknown Source)为什么是Unknown Source?
      

  2.   

    增加tomcat最大连接数
    在tomcat配置文件server.xml中的<Connector ... />配置中
    修改maxProcessors,和acceptCount
      

  3.   

    好好检查程序吧,要么存在资源没有释放(尤其是数据库连接资源),要么是在循环体用String  += String的方式进行String拼接,要么,就是你一次读入太大的文件或者太多的数据
      

  4.   

    不行的话用JProbe测一下是否有内存泄漏
      

  5.   

    这是我们现行的参数(server.xml)
    <Connector port="8080"
                   maxThreads="250" minSpareThreads="50" maxSpareThreads="150"
                   enableLookups="false" redirectPort="8443" acceptCount="200"
                   debug="0" connectionTimeout="20000" 
                   disableUploadTimeout="true" />
    我觉得这个参数已经应该够用了!但还是会出现内存溢出的。
      

  6.   

    也有可能是有太多的“流浪”线程
    建议看看java进程的线程计数
      

  7.   

    1、 Java线程入门
    2、 JAVA线程第三版
    搜捕一下
    http://www.ibook8.com/
      

  8.   

    调整以下系统参数 
    max_thread_proc nkthread nproc
    java -green 好像Solaris支持
      

  9.   

    谢谢 楼上的,我再试试!tks!
      

  10.   


    apache+Tomcat集群,以这台机器的配置,可以开5个Tomcat. 一个tomcat肯定是不够用的
      

  11.   

    楼上大虾的意思 是 开多个tomcat,分担负载么?
    tks!正在一点的找呢。
      

  12.   

    500的并发访问在理论上tomcat是可以支撑的,你的硬件配置也足以支撑这种规模的应用,我觉得是内存泄漏引起的问题,楼上有位兄弟已经说过了,在这种情况下你的硬件配置越好,发病周期就越长。