2009-10-15 30 views
6

Solo en la última semana he estado teniendo problemas para acceder a una aplicación web JBoss (v 4.2.2). Cuando voy a la página de inicio, obtengo una página de error java.lang.NullPointerException. Después de mirar la salida de registro de JBoss, parece que hay demasiados archivos abiertos, entonces ¿cómo voy a cerrar estos archivos? Aquí está la salida del registro de JBoss:JBoss Demasiados archivos abiertos Error

ERROR [[jsp]] Servlet.service() for servlet jsp threw exception 
    java.io.FileNotFoundException: /usr/local/jboss-4.2.2.GA/server/default/work/jboss.web/localhost/catissuecore/org/apache/jsp/pages/content/home/Error_jsp.java (Too many open files) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:70) 
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:152) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) 
    at java.lang.Thread.run(Thread.java:619) 
ERROR [[localhost]] Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/pages/content/home/Error.jsp] 
    org.apache.jasper.JasperException: Unable to compile class for JSP 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:574) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) 
    at java.lang.Thread.run(Thread.java:619) 
    Caused by: java.io.FileNotFoundException: /usr/local/jboss-4.2.2.GA/server/default/work/jboss.web/localhost/catissuecore/org/apache/jsp/pages/content/home/Error_jsp.java (Too many open files) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:70) 
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:152) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566) 
    ... 21 more 

Respuesta

11

En primer lugar desea determinar qué archivo (s) permanecerá abierta. Estoy asumiendo que su servidor se ejecuta en Linux, así que una vez que sabes JBoss'es PID

ps ax | grep something-that-makes-your-jboss-process-unique 

que puedo hacer

ls -l /proc/jbosspid/fd 

para conseguir una buena lista de archivos que están abiertos en ese instante.

Lo que vamos a hacer a continuación depende un poco de lo que se ve aquí:

  1. es posible que sólo tenga que el número de archivos que el servidor puede abrir un poco con ulimit (también mirar a todo el sistema límites en su servidor)
  2. tal vez usted detectar una serie de archivos de su aplicación se olvidó de cerrar
  3. ....

Pero para cerrar estos archivos/deshacerse de los archivos abiertos que tendrá que reiniciar el JBos s instancia.

+4

+1 para detectar fugas antes de aumentar ulimit. –

5

Suponiendo que se ejecuta en Linux (u otro * NIX), entonces hay un límite de descriptor de archivo de 1024 por proceso. En Unix, todo es un archivo, incluidos un socket, un dispositivo, etc. Un wat para echar un vistazo a esto es ejecutar el comando lsof (solo como root) - le mostrará todos los descriptores de archivos abiertos.

Para arreglarlo, edite el archivo en /etc/security/limits.conf y agregue las siguientes líneas y reinicie su jboss.

jboss   soft nofile   16384 
jboss   hard nofile   16384 

(suponiendo que su JBoss está dirigido por el usuario "JBoss")

3

tuve este problema también (en Linux). Lo que hice:

  1. Verificar límites: ulimit -a
  2. cheque 2 líneas de salida:
 
    open files      (-n) 1024 
    max user processes    (-u) 1024 
  1. ambos parámetros (por ejemplo, en su .bash_profile)
 
    ulimit -n 100000 
    ulimit -u 100000 

En mi caso tuve que cambiar ambos parámetros para resolver el problema.

Cuestiones relacionadas