2010-02-28 27 views
8

No puedo entender algunas cosas en la recolección de basura.Recolección de basura

En primer lugar, ¿cómo se asignan los datos al espacio? es decir, en la pila o en el montón (según mi conocimiento, todas las variables estáticas o globales tienen espacio asignado en la pila y las variables locales tienen espacio asignado en el montón).

En segundo lugar, ¿GC funciona con datos en pilas o montones? es decir, un algoritmo GC como Mark/Sweep se referiría a los datos en la pila como root set ¿no? Y luego mapee todas las variables alcanzables en el montón al verificar qué variables en el montón hacen referencia al conjunto raíz.

¿Qué pasa si un programa no tiene una variable global? ¿Cómo funciona el algoritmo entonces?

Saludos, darkie

+2

¿Está preguntando sobre una plataforma/recolector de basura en particular? Edite sus etiquetas y/o preguntas para ser más específico. – Jay

+0

Eso es en general ... Hablando en referencia al enlace de la wikipedia: http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29 –

Respuesta

11

Podría ayudar a aclarar lo de la plataforma de GC que estás preguntando - JVM, CLR, Lisp, etc. Dicho:

En primer lugar para dar un paso atrás, ciertas variables locales de generalmente se asignan en la pila. Sin embargo, los detalles pueden variar según el idioma. Para tomar C# como ejemplo, solo se almacenan en la pila los Value Types locales y los parámetros del método. Por lo tanto, en C#, foo se asignarían en la pila:

public function bar() { 
    int foo = 2; 
    ... 
} 

Alternativamente, las variables asignados dinámicamente de uso de la memoria del montón. Esto debería tener sentido intuitivamente, ya que de lo contrario la pila tendría que crecer dinámicamente cada vez que se llame a new. Además, significaría que tales variables solo podrían usarse como locals dentro de la función local que las asignó, lo que por supuesto no es cierto porque podemos tener (por ejemplo) variables de miembros de clase. Así que para tomar otro ejemplo de C#, en el siguiente caso result se asigna en el montón:

public class MyInt 
{   
    public int MyValue; 
} 

... 
MyInt result = new MyInt(); 
result.MyValue = foo + 40; 
... 

Ahora, con estos antecedentes en mente, la memoria en el montón es recolección de basura. La memoria en la pila no necesita GC ya que la memoria se recuperará cuando regrese la función actual. En un nivel alto, un algoritmo GC funciona mediante el seguimiento de todos los objetos que se asignan dinámicamente en el montón. Una vez asignado a través de new, el objeto será rastreado por GC, y se recopilará cuando ya no esté dentro del alcance y no haya más referencias al mismo.

+0

Muchas gracias. Esto hace que las cosas sean mucho más fáciles de entender –

+0

"Para tomar C#, solo los tipos de valores se almacenan en la pila". - Esto no es estrictamente correcto. Citando "C# In Depth", página 52: "... el valor de una variable vive donde está declarado, así que si tiene una clase con una variable de instancia de tipo int, el valor de esta variable para cualquier objeto dado siempre estará donde el resto de los datos para el objeto son - en el montón ... Solo las variables locales y los parámetros del método viven en la pila ... " – duffymo

+1

Correcto, quise decir que solo las variables locales que son Value Types se almacenarán en la pila. Actualizaré la respuesta para que quede más claro ... –

2

En primer lugar, ¿cómo se asignan los datos al espacio? es decir, en la pila o el montón (Según mi conocimiento , todas las variables estáticas o globales tienen espacio asignado en la pila y las variables locales tienen asignado el espacio en el montón).

No, las variables de pila son llamadas a métodos y variables locales. Un marco de pila se crea cuando se llama al método y aparece cuando vuelve.

La memoria en Java y C# se asigna en el montón llamando a "nuevo".

En segundo lugar, ¿GC funciona con datos en pilas o montones? es decir, un algoritmo de GC como Marcar/Barrido se referiría a los datos en la pila como conjunto raíz, ¿verdad?Y luego mapee todas las variables alcanzables en el montón por comprobando qué variables en el montón se refieren al conjunto de raíz .

GC se utiliza en el montón.

La marca y el barrido no se consideran un algoritmo GC de vanguardia. Tanto Java como .NET GC usan ahora modelos generacionales.

¿Qué pasa si un programa no tiene una variable global ? ¿Cómo funciona el algoritmo entonces?

¿Qué significa "variable global" en idiomas como Java y C# donde todo pertenece a una clase?

La raíz del gráfico de objetos es arbitraria. Debo admitir que no sé cómo se elige.

+0

Muchas gracias ... eso me explica mucho. –

1

Lea this article. Es una muy buena encuesta sobre técnicas de recolección de basura de uniprocesador. Le dará la comprensión básica y la terminología en GC. Luego, siga con el libro de Jones and Lins "Garbage Collection: Algorithms for Automatic Dynamic Memory Management". Contrario al artículo de la encuesta que menciono arriba, el libro no está disponible gratis en la Web; Tienes que comprarlo; Pero vale la pena.

0

Usted puede encontrar el breve resumen de Garbage Collection on the Memory Management Reference útil.

En última instancia, la recolección de basura tiene que comenzar en los registros de los procesadores, ya que cualquier objeto que no pueda ser alcanzado por el procesador se puede reciclar. Según el idioma y el sistema de tiempo de ejecución, tiene sentido suponer de forma estática que las pilas y los registros de subprocesos también son alcanzables, así como también las "variables globales".

Las pilas probablemente obtengan las variables locales. Entonces en GC simples comienzas escaneando contextos de subprocesos, sus stacks y las variables globales. Pero eso ciertamente no es cierto en todos los casos. Algunos idiomas no usan stacks o tienen variables globales como tales. Además, los GC pueden usar un barrier para que no tengan que mirar cada pila o global cada vez. Algunos hardware especializados, como el Symbolics Lisp Machine tenían barreras en los registros.