fbpx
Wikipedia

Fuga de memoria

Una fuga de memoria (más conocido por el término inglés memory leak) es un error de software que ocurre cuando un bloque de memoria reservada no es liberada en un programa de computación. Comúnmente ocurre porque se pierden todas las referencias a esa área de memoria antes de haberse liberado.

Dependiendo de la cantidad de memoria perdida y el tiempo que el programa siga en ejecución, este problema puede llevar al agotamiento de la memoria disponible en la computadora.

Este problema se da principalmente en aquellos lenguajes de programación en los que el manejo de memoria es manual (C o C++ principalmente), y por lo tanto es el programador el que debe saber en qué momento exacto puede liberar la memoria. Otros lenguajes utilizan un recolector de basura o conteo de referencias que automáticamente efectúa esta liberación. Sin embargo todavía es posible la existencia de fugas en estos lenguajes si el programa acumula referencias a objetos, impidiendo así que el recolector llegue a considerarlos en desuso.

Existen varias formas de luchar contra este problema. Una forma es el uso de un recolector de basura incluso en el caso en el que este no sea parte estándar del lenguaje. El más conocido recolector de basura usado de esta manera es el . Otras técnicas utilizadas son la adopción de esquemas de conteo de referencias o el uso de pools de memoria (técnica menos popular, utilizada en el servidor Apache y en el sistema de versiones Subversion).

También hay herramientas para "auscultar" un programa y detectar las fugas. Una de las herramientas más conocidas es Valgrind.

RAII

"Adquirir Recursos es Inicializar", a menudo referido por sus siglas en inglés RAII (de "Resource Acquisition Is Initialization"), es un popular patrón de diseño en varios lenguajes de programación orientados a objetos como C++, y Ada. RAII soluciona las fugas de memoria relacionando objetos con los recursos adquiridos, y automáticamente liberando los recursos cuando los objetos terminan su vida. A diferencia de la recolección de basura, RAII tiene las ventajas de: saber cuándo los objetos existen y saber cuándo no. Se puede comparar los siguientes ejemplos en C y C++:

/* Versión en C */ #include <stdlib.h> void f(int n) { int* array = calloc(n, sizeof(int)); realizar_otras_operaciones(); free(array); } 
// Versión en C++. #include <vector> void f(int n) { std::vector<int> array (n); realizar_otras_operaciones(); } 

La versión en C requiere que el desarrollador haga la liberación de memoria, a diferencia de la versión en C++. Esto evita la sobrecarga de los esquemas de la recolección de basura, e incluso puede ser aplicado a otros recursos como:

  • "Handles" a archivos, que la recolección de basura "mark-and-sweep" no maneja tan efectivamente.
  • Ventanas que han de ser cerradas.
  • Iconos en el área de notificación que han de ser ocultados.
  • Código de sincronización como monitores, secciones críticas, etc. que deben ser liberados para permitir que otros hilos de ejecución("threads") los obtengan.
  • "Handles" al registro de Windows que están abiertos.
  • Conexiones de red.
  • Objetos GDI de Windows.
  • Acciones a realizar cuando se termina una función (o bloque de código) en cualquier punto posible (la acción la realiza el destructor de un objeto creado cuando empieza la función).

Fugas de memoria en lenguajes con recolector de basura

Las fugas de memoria en lenguajes como JavaScript también son comunes, por ejemplo pueden ocurrir cuando hay referencias circulares entre los objetos. Por ejemplo un objeto ventana tiene una referencia a cada uno de sus controles (botones, imágenes, etc), a su vez cada control tiene una referencia a la ventana que lo contiene. Los recolectores de memoria que usan conteo de referencias pueden no darse cuenta de que una ventana ya no es usada porque sigue habiendo referencia a ella (de sus controles).

Estas fugas de memoria son muy comunes cuando se programa en forma despreocupada. Hay técnicas para evitarlas (por ejemplo eliminar alguna de las referencias para cortar el círculo).

En JavaScript ocurren también referencias circulares cuando se escriben funciones dentro de otras, porque cuando una función es escrita dentro de otra se mantiene una referencia a la que la incluye (para poder usar sus variables). El concepto de clausura explica estos comportamientos.

Véase también

  •   Datos: Q751740

fuga, memoria, este, artículo, sección, necesita, referencias, aparezcan, publicación, acreditada, este, aviso, puesto, enero, 2013, fuga, memoria, más, conocido, término, inglés, memory, leak, error, software, ocurre, cuando, bloque, memoria, reservada, liber. Este articulo o seccion necesita referencias que aparezcan en una publicacion acreditada Este aviso fue puesto el 10 de enero de 2013 Una fuga de memoria mas conocido por el termino ingles memory leak es un error de software que ocurre cuando un bloque de memoria reservada no es liberada en un programa de computacion Comunmente ocurre porque se pierden todas las referencias a esa area de memoria antes de haberse liberado Dependiendo de la cantidad de memoria perdida y el tiempo que el programa siga en ejecucion este problema puede llevar al agotamiento de la memoria disponible en la computadora Este problema se da principalmente en aquellos lenguajes de programacion en los que el manejo de memoria es manual C o C principalmente y por lo tanto es el programador el que debe saber en que momento exacto puede liberar la memoria Otros lenguajes utilizan un recolector de basura o conteo de referencias que automaticamente efectua esta liberacion Sin embargo todavia es posible la existencia de fugas en estos lenguajes si el programa acumula referencias a objetos impidiendo asi que el recolector llegue a considerarlos en desuso Existen varias formas de luchar contra este problema Una forma es el uso de un recolector de basura incluso en el caso en el que este no sea parte estandar del lenguaje El mas conocido recolector de basura usado de esta manera es el Boehm Demers Weiser conservative garbage collector Otras tecnicas utilizadas son la adopcion de esquemas de conteo de referencias o el uso de pools de memoria tecnica menos popular utilizada en el servidor Apache y en el sistema de versiones Subversion Tambien hay herramientas para auscultar un programa y detectar las fugas Una de las herramientas mas conocidas es Valgrind RAII EditarArticulo principal Adquirir Recursos es Inicializar Adquirir Recursos es Inicializar a menudo referido por sus siglas en ingles RAII de Resource Acquisition Is Initialization es un popular patron de diseno en varios lenguajes de programacion orientados a objetos como C y Ada RAII soluciona las fugas de memoria relacionando objetos con los recursos adquiridos y automaticamente liberando los recursos cuando los objetos terminan su vida A diferencia de la recoleccion de basura RAII tiene las ventajas de saber cuando los objetos existen y saber cuando no Se puede comparar los siguientes ejemplos en C y C Version en C include lt stdlib h gt void f int n int array calloc n sizeof int realizar otras operaciones free array Version en C include lt vector gt void f int n std vector lt int gt array n realizar otras operaciones La version en C requiere que el desarrollador haga la liberacion de memoria a diferencia de la version en C Esto evita la sobrecarga de los esquemas de la recoleccion de basura e incluso puede ser aplicado a otros recursos como Handles a archivos que la recoleccion de basura mark and sweep no maneja tan efectivamente Ventanas que han de ser cerradas Iconos en el area de notificacion que han de ser ocultados Codigo de sincronizacion como monitores secciones criticas etc que deben ser liberados para permitir que otros hilos de ejecucion threads los obtengan Handles al registro de Windows que estan abiertos Conexiones de red Objetos GDI de Windows Acciones a realizar cuando se termina una funcion o bloque de codigo en cualquier punto posible la accion la realiza el destructor de un objeto creado cuando empieza la funcion Fugas de memoria en lenguajes con recolector de basura EditarLas fugas de memoria en lenguajes como JavaScript tambien son comunes por ejemplo pueden ocurrir cuando hay referencias circulares entre los objetos Por ejemplo un objeto ventana tiene una referencia a cada uno de sus controles botones imagenes etc a su vez cada control tiene una referencia a la ventana que lo contiene Los recolectores de memoria que usan conteo de referencias pueden no darse cuenta de que una ventana ya no es usada porque sigue habiendo referencia a ella de sus controles Estas fugas de memoria son muy comunes cuando se programa en forma despreocupada Hay tecnicas para evitarlas por ejemplo eliminar alguna de las referencias para cortar el circulo En JavaScript ocurren tambien referencias circulares cuando se escriben funciones dentro de otras porque cuando una funcion es escrita dentro de otra se mantiene una referencia a la que la incluye para poder usar sus variables El concepto de clausura explica estos comportamientos Vease tambien EditarMemoria dinamica Conteo de referencias Recolector de basura Datos Q751740Obtenido de https es wikipedia org w index php title Fuga de memoria amp oldid 130922285, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos