2011-06-14 14 views
19

Para obtener una actualización de esta pregunta, consulte más abajo.Java 6 Update 25 VM crash: memoria insuficiente

experimento una JVM (al menos para mí reproducibles) accidente (no un OutOfMemoryError) (La aplicación que se estrella es 3.6.2 Eclipse). Sin embargo, mirando el registro de bloqueo hace que me pregunto:

# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (malloc) failed to allocate 65544 bytes for Chunk::new 
# Possible reasons: 
# The system is out of physical RAM or swap space 
# In 32 bit mode, the process size limit was hit 
# Possible solutions: 
# Reduce memory load on the system 
# Increase physical memory or swap space 
# Check if swap backing store is full 
# Use 64 bit Java on a 64 bit OS 
# Decrease Java heap size (-Xmx/-Xms) 
# Decrease number of Java threads 
# Decrease Java thread stack sizes (-Xss) 
# Set larger code cache with -XX:ReservedCodeCacheSize= 
# This output file may be truncated or incomplete. 

Current thread (0x531d6000): JavaThread "C2 CompilerThread1" daemon 
[_thread_in_native, id=7812, stack(0x53af0000,0x53bf0000)] 

Stack: [0x53af0000,0x53bf0000], sp=0x53bee860, free space=1018k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
V [jvm.dll+0x1484aa] 
V [jvm.dll+0x1434fc] 
V [jvm.dll+0x5e6fc] 
V [jvm.dll+0x5e993] 
V [jvm.dll+0x27a571] 
V [jvm.dll+0x258672] 
V [jvm.dll+0x25ed93] 
V [jvm.dll+0x260072] 
V [jvm.dll+0x24e59a] 
V [jvm.dll+0x47edd] 
V [jvm.dll+0x48a6f] 
V [jvm.dll+0x12dcd4] 
V [jvm.dll+0x155a0c] 
C [MSVCR71.dll+0xb381] 
C [kernel32.dll+0xb729] 

Estoy utilizando Windows XP SP3 de 32 bits. Tengo 4GB de RAM. Antes de comenzar la aplicación tenía 2 GB gratis de acuerdo con el administrador de tareas (+ 1 GB del sistema de caché que también podría liberarse). Definitivamente tengo suficiente RAM libre.

Desde el inicio hasta la falla registré las estadísticas de memoria jvm usando visualvm y jconsole. Adquirí las estadísticas de consumo de memoria hasta los últimos momentos antes del accidente.

Las estadísticas muestra los siguientes tamaños de memoria asignados:

  • TamañoPila: 751 MB (utilizado 248 MB)
  • no TamañoPila (PermGen & CodeCache): 150 MB (utilizado 95 MB)
  • tamaño de las áreas de gestión de memoria (Edenspace, viejo-gen, etc.): 350 MB
  • Tema tamaño de la pila s: 17 MB (de acuerdo con oracle y debido al hecho de que 51 hilos están ejecutando)

Estoy funcionando la aplicación (jre 6 actualización 25, vm servidor) usando los parámetros:

-XX:PermSize=128m 
-XX:MaxPermSize=192m 
-XX:ReservedCodeCacheSize=96m 
-Xms500m 
-Xmx1124m 

pregunta:

  • ¿por qué el bloqueo de JVM cuando obviamente hay suficiente memoria en la máquina virtual y el sistema operativo?
    Con la configuración anterior, creo que no puedo alcanzar el límite de 2 GB de 32 bits (1124 MB + 192 MB + 96 MB + pilas de subprocesos < 2 GB). En cualquier otro caso (demasiada asignación de heap), preferiría esperar un OutOfMemoryError que un jvm crash

¿Quién me puede ayudar a descubrir qué está pasando mal aquí?

(Nota: Actualicé recientemente a Eclipse 3.6.2 de Eclipse 3.4.2 y de Java 5 a Java 6.Sospecho que hay una conexión entre los accidentes y estos cambios, porque no he visto esto antes)

ACTUALIZACIÓN

It seems to be a jvm bug introducido en Java 6 Update 25 y tiene algo que ver con el nuevo compilador de jit. Véase también this blog entry. Según el blog, la corrección de este error debería formar parte de la próxima actualización de java 6. Mientras tanto, obtuve un seguimiento de pila nativo durante un bloqueo. Actualicé el registro de bloqueo anterior.

La solución propuesta, con el argumento de VM -XX:-DoEscapeAnalysis obras (al menos es notablemente baja la probabilidad de un accidente)

+0

Puede que esté configurando el tamaño de memoria máximo demasiado alto para que el espacio de 32 bits sea compatible. Por lo general, la JVM detecta esto, pero puede estar cerca del límite de una manera que no puede detectar. –

+0

Si aumenta su 'PermSize' a' 512m' y agrega '-XX: PermSize = 512m', ¿aún se produce el error? –

+2

¿Qué versión de Java 6 es esta? La descripción es similar a [este ID de error] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7042582), excepto por el volcado de subprocesos. –

Respuesta

-2

La JVM tiene sus propios límites que no se detendrán mucho antes de que llegue a los límites de memoria físicos o virtuales . Lo que necesita ajustar es el tamaño del montón, que es con otro de los indicadores -X. (Creo que es algo creativo como -XHeapSizeLimit pero voy a comprobar en un segundo.)

Here we go:

-Xmsn Especificar el tamaño inicial, en bytes, de la memoria reservada. Este valor debe ser un múltiplo de 1024 mayor que 1 MB. Agregue la letra k o K para indicar kilobytes, o m o M para indicar megabytes. El valor predeterminado es 2MB. Ejemplos:

-Xms6291456 
    -Xms6144k 
    -Xms6m 

-Xmxn Especifique el tamaño máximo, en bytes, del grupo de asignación de memoria. Este valor debe ser un múltiplo de 1024 mayor que 2MB. Agregue la letra k o K para indicar kilobytes, o m o M para indicar megabytes. El valor predeterminado es 64 MB. Ejemplos:

-Xmx83886080 
    -Xmx81920k 
    -Xmx80m 
+1

¿Quiere decir -Xmx? Esto es lo que estoy estableciendo aquí. Y como se indica en la publicación, teóricamente no puedo alcanzar ese límite y, aunque lo quisiera, preferiría obtener un OutOfMemoryError, por lo que este no puede ser el caso, en mi humilde opinión. – MRalwasser

+0

No sabe que no puede ser el caso, ya que solo está mirando la última muestra * antes * de que se bloquee. Eche un vistazo aquí http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html y pruebe a configurar -XX: -HeapDumpOnOutOfMemoryError –

+0

También querrá ver jmap http: //www.oracle.com/technetwork/articles/javase/monitoring-141801.html#Heap_Dump –

1

I tropezado con un problema similar en el trabajo. Habíamos configurado -Xmx65536M para nuestra aplicación, pero obtuvimos exactamente el mismo tipo de errores. Lo curioso es que los errores ocurrieron siempre en un momento en que nuestra aplicación realmente estaba haciendo cálculos bastante ligeros, en términos relativos, y por lo tanto no estaba cerca de este límite.

Encontramos una posible solución para el problema en línea: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-unable-to-create-new-native-thread.jsp, y parecía resolver nuestro problema. Después de bajar -Xmx a 50G, no hemos tenido ninguno de estos problemas.

Lo que realmente sucede en el caso aún no está claro para nosotros.

+0

El enlace está roto. – mrswadge

Cuestiones relacionadas