multithreading - aumento de bytes privados para un proceso javaw en java 8
java-8 jni (3)
Puede probar otra implementación de GC como G1 introducida en Java 7 y probablemente la GC predeterminada en Java 9 . Para hacerlo, solo inicie sus aplicaciones Java con:
-XX:+UseG1GC
También hay una funcionalidad interesante con G1 GC en Java 8u20 que puede buscar cadenas duplicadas en el montón y "deduplicarlas" (esto solo funciona si activa G1, no con el GC de Java 8 predeterminado).
-XX:+UseStringDeduplication
Tenga en cuenta que debe probar su sistema a fondo antes de pasar a la producción con dicho cambio.
Aquí puede encontrar una buena descripción de los diferentes GC que puede usar
Mi proyecto ha comenzado a usar java 8 de java 7.
Después de cambiar a Java 8, estamos viendo problemas como que la memoria consumida aumenta con el tiempo.
Aquí están las investigaciones que hemos hecho:
- Los problemas solo aparecen después de migrar desde java7 y desde java8
- Como el metaespacio es lo único relacionado con la memoria, que es el cambio de hava 7 a java 8. Controlamos el metaespacio y esto no crece más de 20 MB.
- Heap también permanece consistente.
Ahora, el único camino que queda es analizar cómo se distribuye la memoria para procesar en java 7 y java 8, específicamente en la memoria privada de bytes. Cualquier pensamiento o enlace aquí sería apreciado.
NOTA: esta aplicación javaw es una aplicación basada en swing.
ACTUALIZACIÓN 1 : Después de analizar la memoria nativa con la herramienta NMT y generó una diferencia de memoria ocupada en comparación con la línea de base. Descubrimos que el montón seguía siendo el mismo, pero los hilos están perdiendo todo este recuerdo. Entonces, como no hay cambios en Heap, supongo que esta fuga se debe al código nativo.
Entonces el desafío sigue abierto. Cualquier idea sobre cómo analizar la memoria ocupada por todos los hilos será útil aquí. A continuación se muestran las instantáneas tomadas del seguimiento de la memoria nativa.
En esta foto, puedes ver que 88 MB aumentaron en subprocesos. Donde el conteo de los recursos de arena y recursos había aumentado mucho.
en esta imagen puede ver que 73 MB han aumentado en este Malloc. Pero no se muestra ningún nombre de método aquí.
Así que, por favor, arroja algo de información para comprender estas 2 capturas de pantalla.
Considere optimizar las opciones de JVM
Colector paralelo (colector de rendimiento)
-XX: + UseParallelGC
colectores concurrentes (colectores de baja latencia)
-XX: + UseConcMarkSweepGC
utilizar String Duplicates removedor
-XX: + UseStringDeduplication
optimizar la relación de compactación
-XXcompactRatio: y refiere link1 link2
En esta mi respuesta , puede ver información y referencias sobre el perfil de la memoria nativa de JVM para encontrar fugas de memoria. En breve, mira esto .
ACTUALIZAR
¿ Usó -XX: NativeMemoryTracking = opción de detalle ? Los resultados son claros, muestran que la memoria más asignada por malloc. :) Es un poco obviamente. El siguiente paso es perfilar su aplicación. Para analizar métodos nativos y Java uso (y lo usamos en producción) gráficos de llama con perf_events. Mire esta publicación de blog para un buen comienzo.
Tenga en cuenta que su memoria aumentó para los hilos, es probable que sus hilos crezcan en la aplicación. Antes de realizar el análisis, recomiendo analizar los volcados de hilo antes / después de verificar el número de subprocesos de Java y por qué. Volcados de subprocesos que puede obtener con jstack / jvisualvm / jmc, etc.