2010-08-05 14 views
8

Esto podría ser bastante básico, pero era muy curioso de saber. He aquí el fragmento de código y la salida¿Qué está recolectando GC aquí?

public class PlainSystemGC { 

    public static void main(String ...strings) { 

     System.out.println("Free Memory (Before GC): " + Runtime.getRuntime().freeMemory()); 

     System.gc(); 

     System.out.println("Free Memory (After GC): " + Runtime.getRuntime().freeMemory()); 
    } 
} 

y la salida

Free Memory (Before GC): 1859640 
Free Memory (After GC): 1911768 

estoy interesado en saber lo que está GC recogiendo aquí, ya que no se crean objetos.

¿Cuál es la memoria que se está liberando? (Y que también 52kb)


@JSauer - Se da exactamente los mismos resultados, incluso si se ejecuta 100 veces

+0

No siempre es lo mismo: http://ideone.com/5UkgE (122416 liberado) – NullUserException

+0

@NullUserExeception - La cantidad de memoria liberada puede ser diferente en diferentes JVMS, pero el número liberado sería el mismo en todos diferentes ejecuciones del mismo código – JWhiz

Respuesta

9

En la mayoría de las implementaciones de JVM main el método no es en realidad la primera pieza de código Java que se ejecuta durante el inicio de JVM.

Por lo general, muchas partes de un JRE completo se implementan en Java. Por ejemplo, una gran parte del mecanismo del cargador de clases se implementa en Java puro. Incluso podría escribir partes del algoritmo de recolección de basura en Java.

Debido a esto, es posible que ya exista algo de basura de esas clases del sistema que el gc pueda recopilar aunque su aplicación no haya creado ningún tipo de basura.

Por cierto, su aplicación crea al menos un objeto que es elegible para la recolección de basura en el punto donde se llama System.gc(): String que menciona que la memoria libre está construida dinámicamente y no contenida en una variable, por lo que bien podría ser gc-ed durante la llamada System.gc().

+0

Muy cierto. Pero, la cadena no consumiría definitivamente 52K de memoria;) creo ... – JWhiz

+0

Además, usar un campo estático puede hacer que se ejecute el código de inicialización de clase. Por ejemplo, si la clase del sistema no estuviera inicializada antes de main(), usar System.out lo haría. Consulte la especificación del idioma en http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44557. –

+1

Dudo que el 'String' utilizado en' System.out' sea basura recolectada. Incluso si no se mantiene en una variable, es internado por la clase 'String' ya que es un literal. – samitgaur

Cuestiones relacionadas