java - collector - ¿Con qué parámetros de GC se está ejecutando una JVM?
java configure garbage collector (5)
Si está buscando una herramienta fácil de leer rápida y fácil, jconsole puede ser su amigo aquí. Específicamente, estoy mirando la pestaña "Resumen VM" en mi proceso actual de FindBugs y veo estos detalles:
Tamaño de pila actual: 788,720 kbytes
Tamaño máximo de almacenamiento dinámico: 932,096 kbytes
Memoria comprometida: 923,648 kbytes
Finalización pendiente: 0 objetos
Recolector de basura: Nombre = ''PS MarkSweep'', Colecciones = 324, Tiempo total gastado = 12 minutos
Recolector de basura: Nombre = ''PS Scavenge'', Colecciones = 1,132, Tiempo total dedicado = 1 minuto
Obviamente, jvisualvm le dará detalles relacionados, pero no parece estar tan enfocado en sus necesidades específicas (es decir, detalles rápidamente legibles sobre el recolector de basura).
Todavía estoy investigando los problemas que tengo con la sintonización de GC (vea la pregunta anterior ), que implica mucha lectura y experimentación.
Las JVM Sun Java5 + intentan seleccionar automáticamente la estrategia y los parámetros de GC óptimos en función de su entorno, lo cual es excelente, pero no puedo encontrar la manera de consultar la JVM en ejecución para averiguar cuáles son esos parámetros.
Idealmente, me gustaría ver qué valores de las diversas opciones relacionadas con GC -XX se están utilizando, según lo seleccionado automáticamente por la máquina virtual. Si tuviera eso, podría tener una línea de base para comenzar a ajustar.
¿Alguien sabe recuperar estos valores de una máquina virtual en ejecución?
Mira el HotSpotDiagnosticMBean
El siguiente ejemplo imprimirá el valor de una opción y también si el valor es DEFAULT o VM_CREATION:
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
public class HotSpotTest {
public static void main(String [] args) throws Exception {
printHotSpotOption("MaxHeapFreeRatio");
printHotSpotOption("SurvivorRatio");
printHotSpotOptions();
}
private static void printHotSpotOption(String option) throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String operationName = "getVMOption";
Object [] params = new Object [] {option};
String [] signature = new String[] {String.class.getName()};
Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature);
CompositeDataSupport data = (CompositeDataSupport) result;
System.out.println(option);
System.out.println("- Value: "+data.get("value"));
System.out.println("- Origin: "+data.get("origin"));
}
private static void printHotSpotOptions() throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String attributeName = "DiagnosticOptions";
Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName);
CompositeData [] array = (CompositeData[]) result;
for (CompositeData d : array) {
System.out.println(d.get("name"));
System.out.println("- Value: "+d.get("value"));
System.out.println("- Origin: "+d.get("origin"));
}
}
}
-XX: + PrintCommandLineFlags Imprime banderas pasadas en la línea de comandos o configuradas mediante las funciones de ergonomía (auto-tamaño).
-XX: + PrintFlagsInitial Dumps TODOS los indicadores y valores predeterminados.
-XX: + PrintFlagsFinal Dumps TODAS las banderas después de procesar la línea de comando y la ergonomía.
Así que creo que lo último lo hará por ti, solo agrégalo a tu script de línea de comandos.
Idealmente, me gustaría ver qué valores de las diversas opciones relacionadas con GC -XX se están utilizando, según lo seleccionado automáticamente por la máquina virtual. Si tuviera eso, podría tener una línea de base para comenzar a ajustar.
Normalmente no es sencillo deducir la configuración exacta del montón solo desde los indicadores de línea de comando suministrados.
Si lo que necesita es conocer la configuración del montón y se encuentra en un entorno que no sea de Windows, puede usar jmap -heap
como se explica en esta entrada del blog .
Aquí hay una muestra de la información proporcionada:
using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 268435456 (256.0MB) MaxNewSize = 268435456 (256.0MB) OldSize = 805306368 (768.0MB) NewRatio = 7 SurvivorRatio = 6 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB)
Puedes usar JMX para eso. Inicie JConsole, y debería mostrarse en la pestaña Resumen VM . Debería mostrar todos los argumentos que se han pasado a la JVM.
Para hacerlo de manera programática, puede consultar otra respuesta SO: ¿Cómo obtener argumentos vm desde el interior de la aplicación java?