2011-03-09 23 views
6

Tengo una aplicación Java alojada en una empresa de alojamiento web. Cada pocos días mi aplicación se hunde con:Java: no se puede crear un nuevo hilo nativo

[2011-03-09 15:52:14,501] ERROR http-12021-9 
java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:597) 

La empresa de alojamiento dice que significa mi aplicación pierde memoria, pero las herramientas que he están mostrando memoria libre que está disponible. Como el error siempre está creando un nuevo hilo nativo, mi opinión es que el problema está en los recursos de configuración/SO de JVM.

, ¿cómo evitar este error ocurra?

Respuesta

1

¿Ha realizado alguna memoria de seguimiento? Encienda jconsole y mire o registre su consumo de memoria durante un período de 24 horas. Si (en promedio) sube sin volver a bajar, entonces se está quedando sin memoria y posiblemente no tenga suficiente memoria para almacenar los detalles de su nuevo hilo.

7

Su más probable es que el problema con la JVM en el extremo servidor web. Por favor, revisa el siguiente enlace para obtener algunos detalles,

http://blog.egilh.com/2006/06/2811aspx.html

+5

también podría ser un problema con la aplicación que acaba de crear demasiados subprocesos, como se menciona en el artículo, más subprocesos == más uso de memoria espacial nativa que se puede abordar con ajuste ... esto supone número legítimo de subprocesos necesarios para Una aplicación. pero si la aplicación engendra hilos y nunca los mata (fuga de hilo), entonces no hay forma de afinarlo. también podría ser que el sistema operativo tenga un límite en el conteo de hilos por proceso. –

+0

¿Hay alguna manera fácil desde el código de Java para obtener el # de subprocesos asociados con mi proceso? Dado que esta es una empresa de alojamiento web JVM, tengo muy poco acceso a las herramientas de nivel JVM. Sin embargo, puedo instrumentar mi código ... (que es lo que hice para obtener información de la memoria JVM). – tvfoodmaps

+0

no hay manera de que AFAIK, pero la empresa de alojamiento tiene un equipo de soporte que puede volcar los hilos por ti si les enseñas cómo hacerlo. –

2

Cuando el fuego de su proceso, la JVM tiene un tamaño limitada montón (por defecto es de 128 MB). Es posible que ese servidor tenga más memoria, pero su JVM no: usted lo utilizó todo.

Usted puede cambiar esto con los argumentos -Xms y -Xmx línea de comandos, pero sugeriría que la búsqueda de la pérdida de memoria primero :)

+3

No creo que obtenga la parte "no se puede crear un nuevo hilo nativo" del mensaje OOM si esta fue una pérdida de memoria estándar. – tvfoodmaps

+0

Entiendo que estoy usando ese término en el sentido más genérico ya que no hay forma de asignar memoria directamente en java y luego perder su pista como lo hizo en C. ¿Cómo está limpiando estos hilos que comienza? –

+0

¡Gracias, tuve este error con arduino y lo resolví con Xms100m! – Ramast

0

Parece fugas hilo. Los hilos se crean pero luego se atascan en alguna parte. Vuelque los hilos periódicamente para ver si la cantidad de hilos asignados está creciendo. Busque cualquier hilo para dormir/colgar en el vertedero.

kill -QUIT jvm_pid 
1

Es el problema con Linux para manejar archivos abiertos No.of Dar la siguiente manera ulimit -n 65536 (cualquier número u puede dar)

5

Una posibilidad es que se ha alcanzado el usuario límite para la cantidad de archivos abiertos.

Creo que cada proceso/subproceso consume uno o más descriptores de archivos.

Por ejemplo, cuando esto ocurre para el usuario y luego "no" comando shell va a funcionar, ya que los comandos de shell tenedor de un proceso para ejecutar (que se ve errores como "-bash: tenedor: reintento: Recurso temporalmente no disponible")

llegué a este tema y encontró que sólo el usuario actual no fue capaz de generar procsos ... otros usuarios eran uneffected.

Para resolver, suba su configuración de ulimit -n (archivos máx. Abiertos) ... siga los detalles.

Se puede ver sus límites de usuario con el comando:

ulimit -a 

hasta su límite máximo del archivo con lo siguiente:

ulimit -n 65536 

Aquí es lo que tengo en este momento:

$ ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 256797 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 75000 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 10240 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 100000 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Para ver todos los límites explícitos para su sistema:

cat /etc/security/limits.conf 

Tenga en cuenta: Estoy usando Oracle Linux 6.3 - los resultados pueden diferir ligeramente entre las distribuciones.

+0

También tuve problemas con Eclipse Luna en Fedora 20. He leído mucho sobre las diferentes opciones de memoria y todavía no podía resolver el problema. Me volvía loco. Finalmente me di cuenta de que, de forma predeterminada, el número de procesos que un usuario normal puede tener en Fedora es muy limitado. Contenido de limits.d/90-nproc.conf: * soft nproc 1000 Al solucionar esto a 5000 se corrigieron mis problemas de "No se pudo crear un nuevo hilo nativo". – arpadf

Cuestiones relacionadas