recolectores recolector qué old jdk generations gen garbagecollector example collector collection basura java jvm

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.




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



-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.