Basura (informática)


En informática , la basura incluye datos , objetos u otras regiones de la memoria de un sistema informático (u otros recursos del sistema), que no se utilizarán en ningún cálculo futuro por parte del sistema o de un programa que se ejecute en él. Debido a que cada sistema informático tiene una cantidad finita de memoria, y la mayoría del software produce basura, con frecuencia es necesario desasignar la memoria que está ocupada por basura y devolverla al montón , o grupo de memoria, para su reutilización.

La basura generalmente se clasifica en dos tipos: basura sintáctica , cualquier objeto o datos que se encuentran dentro del espacio de memoria de un programa pero que no se pueden alcanzar desde el conjunto raíz del programa ; y basura semántica , cualquier objeto o datos a los que nunca accede un programa en ejecución para cualquier combinación de entradas de programa. Los objetos y datos que no son basura se dice que están activos .

Dicho de manera informal, la basura sintáctica son datos que no se pueden alcanzar, y la basura semántica son datos que no se alcanzarán. Más precisamente, la basura sintáctica son datos a los que no se puede acceder debido al gráfico de referencia (no hay una ruta hacia él), que pueden determinarse mediante muchos algoritmos, como se explica en Seguimiento de la recolección de basura , y solo requiere analizar los datos, no el código. La basura semántica son datos a los que no se accederá, ya sea porque no se puede acceder a ellos (por lo tanto, también basura sintáctica), o porque se puede acceder a ellos pero no se accederá a ellos; este último requiere análisis del código, y es en general un problema indecidible .

La basura sintáctica es un subconjunto (generalmente estricto) de la basura semántica, ya que es completamente posible que un objeto contenga una referencia a otro objeto sin siquiera usar ese objeto.

En la siguiente implementación de pila simple en Java, cada elemento extraído de la pila se convierte en basura semántica una vez que no hay referencias externas a él: [a]

Esto se debe a que elements[]aún contiene una referencia al objeto, pero nunca se volverá a acceder al objeto a través de esta referencia, ya que elements[]es privado para la clase y el popmétodo solo devuelve referencias a elementos que aún no ha extraído. (Después de que disminuya size, esta clase nunca volverá a acceder a ese elemento). Sin embargo, saber esto requiere un análisis del código de la clase, que en general es indecidible.