2010-03-23 13 views
11

? La máquina virtual Java admite varias estrategias de recolección de basura.¿Cómo puedo ver qué recolector de basura java está usando

Esto article lo explica.

Ahora me pregunto qué estrategia (automáticamente seleccionada) está usando mi aplicación, ¿hay alguna manera de dejar que la JVM (versión 1.6) imprima esta información?

Editar: La JVM detecta si está en modo de cliente o servidor. Entonces, la pregunta realmente es ¿cómo puedo ver qué se ha detectado?

+2

Tenga en cuenta que el artículo habla acerca de una implementación específica ** ** (específicamente el HotSpot JVM desde el Sol JRE). –

+0

Sí, estás en lo cierto. – Thirler

+0

Tenga en cuenta que no necesariamente utiliza solo un GC. Por lo general, tiene diferentes estrategias para diferentes áreas. Si usa CMS, creo que el valor predeterminado es usar un "nuevo paralelo" para el área joven. – Fredrik

Respuesta

13

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html que es aplicable para J2SE 6, así afirma que el valor por defecto es el colector paralelo.

Hemos probado esta vez en una JVM 1.5 fijando solamente

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

y la salida mostraron

 
41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs] 
41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs] 

donde PS es sinónimo de Barrido paralelo

0

¿Qué pasa con la información proporcionada por las opciones de línea de comandos -verbose: gc y -XX: + PrintGCDetails? ¿No es útil?

[Editar: Obviamente no]

+0

Eso no imprime qué recolector de basura se está utilizando. – Thirler

4

Joachim ya se ha señalado, la El artículo al que se refiere describe las estrategias de VM que ofrece VM de Sun. La especificación de VM en sí no exige algoritmos de GC específicos y, por lo tanto, no tiene sentido tener, p. valores enumerados para estos en la API.

Sin embargo, puede obtener algunas informaciones de la API de administración:

List<GarbageCollectorMXBean> beans = 
    ManagementFactory.getGarbageCollectorMXBeans(); 

iteración a través de estos granos, se puede obtener el nombre de la GC (aunque sólo como una cadena) y los nombres de los grupos de memoria, que son administrados por los diferentes GC.

13

jmap -heap

imprime un resumen montón. Se imprimió el algoritmo GC utilizado, la configuración de pila y el uso de pila inteligente de generación.

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

+0

Esto es precisamente lo que necesito, desafortunadamente no está disponible en Windows (sin embargo, no tengo idea de por qué). – Thirler

+0

Quizás debería agregar esa información (Windows) a la pregunta;) – fglez

7

poner esto en el JAVA_OPTS:

-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Para el UseSerialGC veremos en el registro:

7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

Para el UseConcMarkSweepGC veremos en el registro:

5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

Para el UseParallelGC veremos en el registro:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 
1

Puede escribir progam simple que se conecta a través jmx a su proceso de java:

public class PrintJMX { 
    public static void main(String[] args) throws Exception { 
    String rmiHostname = "localhost"; 
    String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; 
    JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); 

    JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); 
    MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); 


    ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 

    for (ObjectName name : mbsc.queryNames(gcName, null)) { 
     GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, 
     name.getCanonicalName(), 
     GarbageCollectorMXBean.class); 

     System.out.println(gc.getName()); 
    } 

    } 
} 
4

Parece que, nos tiene una manera más conveniente de definir la versión de GC en tiempo de ejecución. Siempre use herramientas, mi sugerencia. Para definir la versión de GC necesitamos dos herramientas que vienen con JVM (colocado en su directorio jdk/bin):

  1. VisualVM - iniciarlo y tratar de perfilar algún proceso (por ejemplo, usted puede perfilar VisualVM sí mismo). Su perfil le mostrará un PID de proceso (vea los rectángulos verdes en una captura de pantalla).
  2. jMap - iniciar esta herramienta con -heap <PID> opciones y encontrar una cadena dedicada a un tipo del colector de basura (ver una línea de color rosa en una captura de pantalla)

enter image description here

1

mejor manera de conseguir esto es: Go para ordenar Línea e ingrese el siguiente comando.

java -XX: + PrintCommandLineFlags -versión

Se le mostrará como resultado:

C:\windows\system32>java -XX:+PrintCommandLineFlags -version 
-XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl 
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd 
**ividualAllocation -XX:+UseParallelGC** 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here` 
Cuestiones relacionadas