universidades tesis solidos residuos qué que proyecto municipales manejo garbagecollector forzar example como collector activar java garbage-collection

java - tesis - 100% de espacio Eden completo, 0% de espacio de Survivor usado-No se realizó la recolección de basura



tesis de residuos solidos en universidades (4)

Cálculo de SurvivorRatio:

Si SurvivorRatio = 6, la proporción de (One SurvivorSpace: Eden) = (1: 6).
Así que dos Survivor tomarán (2 partes), y Eden tiene 6 partes. Así que en total 8 partes.
Entonces, si tengo un gen joven de 40 MB, Eden es (6/8 * 40) MB y un sobreviviente tendrá (1/8 * 40) MB.

Si SurvivorRatio = 7. Entonces las partes totales son (7 + 1 + 1 = 9). Eden es (7/9 * 40) MB y el sobreviviente tendrá (1/9 * 40) MB

Teóricamente

The SurvivorRatio parameter controls the size of the two survivor spaces. For example, -XX:SurvivorRatio=6 sets the ratio between each survivor space and eden to be 1:6, each survivor space will be one eighth of the young generation.

Matemáticamente

S - Sobreviviente
E - Eden
Y - generación joven

if SurvivorRatio=6 then S / E = 1/6 E = 6S 2S + E = Y 2S + 6S = Y S = Y / 8

Efecto

Si aumentar a más el valor de SurvivorRatio da como resultado un menor espacio para Survivor, los objetos del espacio eden se insertarán directamente en el gen anterior / actual. Menor oportunidad para filtrar objetos en vivo en Survivor Space a través de GC menor. También esto puede aumentar el no de GC completo.

Si reducirlo a un valor más bajo dará como resultado un menor espacio eden hará que el GC menor sea frecuente.

Sepa que el tiempo necesario para un GC menor será más especialmente si estamos usando el algoritmo Serial GC donde solo se usará un solo hilo para GC, aunque su máquina es una máquina de varios núcleos.

También -XX:+UseAdaptiveSizePolicy cuenta que -XX:+UseAdaptiveSizePolicy determinará el propio SurvivorRatio de JVM durante el tiempo de ejecución, pero siempre es mejor mencionarlo manualmente en función de su aplicación al intentar ejecutar una carga múltiple.

Me he encontrado con un caso de GC bastante confuso: si bien el espacio de Eden está lleno al 100%, se usa el espacio de 0% de sobrevivientes. Cuando el Eden está lleno, la recolección de basura debe ser activada, ¿verdad?

¿Puede haber un caso en el que se evite que el demonio GC se ejecute? ¿Te gusta una CPU al 100%?

Estamos utilizando jdk-1.7 .

¿Cuál puede ser la causa? A continuación se muestra la salida de jmap.

También intentamos capturar un uso de memoria más detallado utilizando jmap -histo -F , pero luego el uso de la CPU se redujo a 0% y el proceso de java se volvió inalcanzable.

using thread-local object allocation. Parallel GC with 18 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 12884901888 (12288.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 4265738240 (4068.125MB) used = 4265738240 (4068.125MB) free = 0 (0.0MB) 100.0% used From Space: capacity = 14352384 (13.6875MB) used = 0 (0.0MB) free = 14352384 (13.6875MB) 0.0% used To Space: capacity = 14680064 (14.0MB) used = 0 (0.0MB) free = 14680064 (14.0MB) 0.0% used PS Old Generation capacity = 8589934592 (8192.0MB) used = 8589931920 (8191.997451782227MB) free = 2672 (0.0025482177734375MB) 99.99996889382601% used PS Perm Generation capacity = 41353216 (39.4375MB) used = 41079056 (39.17604064941406MB) free = 274160 (0.2614593505859375MB) 99.33702858805468% used


Cuando veo en su configuración de Heap encontré que

MaxNewSize = 17592186044415 MB es incorrecto, sin embargo, debe estar en bytes.

Lo que veo es que casi todas las generaciones están llenas y al mismo tiempo y Collector está tratando de reunir ambas generaciones para que se bloqueen entre sí.

Sugiero que por favor ajuste la memoria con los siguientes parámetros.

-XX:NewRatio=3 - the young generation will occupy 1/4 the overall heap -XX:NewSize - Calculated automatically if you specify -XX:NewRatio -XX:MaxNewSize - The largest size the young generation can grow to (unlimited if this value is not specified at command line)

También sugiero que use un espacio de sobreviviente que le dará tiempo al recolector cuando los objetos se copien desde la generación de eden a "tenured".

-XX:SurvivorRatio=6 - each survivor space will be 1/8 the young generation

Si los espacios de sobrevivientes son demasiado pequeños, la recopilación de copias se desborda directamente en la generación activa.

Para cualquier aclaración consultar this enlace.

Editar:

-XX:NewRatio=3 - la generación joven ocupará 1/4 del montón general

Cálculo:

y/t=1/3 y+t=h y+3y=h y=h/4 t=tenured y=young h=heap


Los buffers locales de hilo se asignan desde el espacio eden. Tan pronto como se asigna un búfer, el espacio libre en el espacio eden se reduce por completo. Esto puede significar que tienes muchos TLAB que están casi vacíos, pero el espacio eden parece estar lleno. Se activa un GC cuando no hay suficiente espacio libre en el espacio eden.

Si desactiva TLAB -XX:-UseTLAB esto ralentizará el rendimiento, pero obtendrá un -XX:-UseTLAB muy preciso de cómo se utiliza el espacio.


Solo un pensamiento pero veo que la Vieja Gen también está llena. Podría ser que el GC en lugar de intentar limpiar Eden está ocupado ejecutando un GC completo tratando de limpiar la Vieja Generación para evitar la OOM.