java - old - encontrar qué tipo de recolector de basura se está ejecutando
recolector de basura o garbage collection (8)
La ergonomía de Post JSE 5 está destinada a seleccionar automáticamente el tipo de recolector de basura adecuado para usted (entre otras cosas).
Me gustaría saber si hay alguna forma de confirmar / conocer el tipo de recolector de basura y los objetivos de rendimiento elegidos / establecidos por la ergonomía de JVM.
Aquí hay algo de información sobre cómo obtener información de GC programáticamente, pero parece que puede necesitar el nombre del GC de antemano. Molesto.
http://blogs.oracle.com/poonam/entry/how_to_programmatically_obtain_gc
Editar: intente ManagementFactory.getGarbageCollectorMXBeans()
e itere a través de la lista devuelta. Uno de estos estará activo.
Este comando imprime el tipo de GC de una JVM en ejecución:
jmap -heap <pid> | grep GC
Para computadoras modernas (múltiples CPUs, memoria grande), JVM lo detectará como una máquina servidor y usará Parallel GC
por defecto, a menos que especifique qué gc usar a través de las banderas de JVM explícitamente.
p.ej
jmap -heap 26806 | grep GC
Salida:
GC paralelo con 8 hilos
No es una respuesta directa a tu pregunta, pero creo que esto es lo que estás buscando.
De acuerdo con la documentación 1 y 2 Java 6 (no solo Java 5):
La referencia 1 dice:
En las máquinas de clase de servidor que ejecutan la máquina virtual del servidor, el recolector de basura (GC) ha cambiado del recolector en serie anterior [...] a un recolector paralelo
La referencia 2 dice:
Comenzando con J2SE 5.0, cuando se inicia una aplicación, el iniciador puede intentar detectar si la aplicación se está ejecutando en una máquina de "clase de servidor" y, si es así, usar la máquina virtual de servidor HotSpot de Java (VM de servidor) en lugar de Java HotSpot Client Virtual Machine (cliente VM).
Además, la referencia 2 dice:
Nota: para Java SE 6, la definición de una máquina de clase servidor es una con al menos 2 CPU y al menos 2 GB de memoria física.
De esta información, puede saber que si la caja es un servidor (de acuerdo con 2 ), entonces utilizará el GC paralelo. También puede inferir que no cambiará GC durante el tiempo de ejecución.
Probablemente pueda encontrar la respuesta correcta para las máquinas que no son servidores si profundiza en la documentación.
Puede utilizar el indicador -XX
para que JRE elija el recolector de basura que elija.
Ajuste de la recolección de basura con la máquina virtual Java TM 5.0
Además, puedes usar JConsole para monitorear la recolección de basura.
Use los GarbageCollectorMXBean para obtener MemoryPoolMXBean .
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;
public class GCInformation {
public static void main(String[] args) {
try {
List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
System.out.println(gcMxBean.getName());
System.out.println(gcMxBean.getObjectName());
}
} catch (RuntimeException re) {
throw re;
} catch (Exception exp) {
throw new RuntimeException(exp);
}
}
}
Por ejemplo, intente seguir los comandos para conocer varios tipos de GC
java -XX:+PrintCommandLineFlags GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -version
le mostrará el recolector de basura por defecto. También he encontrado útil la siguiente página que detalla el recolector de basura predeterminado para varios sistemas operativos.
-XX:+PrintGC
-XX:+PrintGCDetails
Esto imprimirá lo que se utiliza GC. En mi caso se imprime:
[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Lo que significa que el recolector de basura paralelo se está utilizando para la generación joven. "Falla de asignación" significa que la recolección de basura comenzó porque no había suficiente espacio en la parte del montón de generación joven.