You are on page 1of 14

Introduccin a .

NET Framework

.NET Framework es un entorno de ejecucin runtime que administra aplicaciones cuyo destino es .NET
Framework. Incorpora Common Language Runtime, que proporciona administracin de la memoria y otros
servicios del sistema, y una biblioteca de clases completa, que permite a los programadores aprovechar el
cdigo slido y confiable de todas las reas principales del desarrollo de aplicaciones.
Qu es .NET Framework?
.NET Framework es un entorno de ejecucin administrado que proporciona diversos servicios a las
aplicaciones en ejecucin. Consta de dos componentes principales: Common Language Runtime (CLR), que
es el motor de ejecucin que controla las aplicaciones en ejecucin, y la biblioteca de clases de .NET
Framework, que proporciona una biblioteca de cdigo probado y reutilizable al que pueden llamar los
desarrolladores desde sus propias aplicaciones. Los servicios que ofrece .NET Framework a las aplicaciones
en ejecucin son los siguientes:
Administracin de la memoria. En muchos lenguajes de programacin, los programadores son
responsables de asignar y liberar memoria y de administrar la vida til de los objetos. En las
aplicaciones de .NET Framework, CLR proporciona estos servicios en nombre de la aplicacin.
Sistema de tipos comunes. En los lenguajes de programacin tradicionales, el compilador define los
tipos bsicos, lo que complica la interoperabilidad entre lenguajes. En .NET Framework, los tipos
bsicos los define el sistema de tipos de .NET Framework y son comunes a todos los lenguajes que
tienen como destino .NET Framework.
Biblioteca de clases extensa. En lugar de tener que escribir cantidades extensas de cdigo para
controlar operaciones comunes de programacin de bajo nivel, los programadores pueden usar una
biblioteca de tipos accesible en todo momento y sus miembros desde la biblioteca de clases de .NET
Framework.
Marcos y tecnologas de desarrollo. .NET Framework incluye bibliotecas para determinadas reas
de desarrollo de aplicaciones, como ASP.NET para aplicaciones web, ADO.NET para el acceso a los
datos y Windows Communication Foundation para las aplicaciones orientadas a servicios.
Interoperabilidad de lenguajes. Los compiladores de lenguajes cuya plataforma de destino es .NET
Framework emiten un cdigo intermedio denominado Lenguaje intermedio comn (CIL), que, a su vez,
se compila en tiempo de ejecucin a travs de Common Language Runtime. Con esta caracterstica,
las rutinas escritas en un lenguaje estn accesibles a otros lenguajes, y los programadores pueden
centrarse en crear aplicaciones en su lenguaje o lenguajes preferidos.
Compatibilidad de versiones. Con raras excepciones, las aplicaciones que se desarrollan con una
versin determinada de .NET Framework se pueden ejecutar sin modificaciones en una versin
posterior.
Ejecucin en paralelo. .NET Framework ayuda a resolver conflictos entre versiones y permite que
varias versiones de Common Language Runtime coexistan en el mismo equipo. Esto significa que
tambin pueden coexistir varias versiones de las aplicaciones, y que una aplicacin se puede ejecutar
en la versin de .NET Framework con la que se compil.
Compatibilidad con mltiples versiones (multi-targeting). Al usar la Biblioteca de clases portable
de .NET Framework, los desarrolladores pueden crear ensamblados que funcionen en varias
plataformas, como Windows 7, Windows 8, Windows 8.1, Windows 10, Windows Phone y Xbox 360.

Si una aplicacin que utiliza depende de una versin especfica de .NET Framework, podra daarse si
esa versin se quita.
Algunas versiones de .NET Framework son actualizaciones locales de versiones anteriores. Por
ejemplo, .NET Framework 3,5 es una actualizacin local de la versin 2.0 y .NET Framework 4.6 lo es
de las versiones 4, 4.5, 4.5.1 y 4.5.2.

Si decide quitar .NET Framework, use siempre la opcin Programas y caractersticas del Panel de Control
para desinstalarlo. No quite nunca una versin de .NET Framework manualmente.

Tenga en cuenta que se pueden cargar varias versiones de .NET Framework en un nico equipo al mismo
tiempo. Esto significa que no tiene que desinstalar las versiones anteriores para instalar una versin posterior.

Informacin general acerca de Common Language Runtime

Los compiladores y las herramientas exponen la funcionalidad en tiempo de ejecucin y permiten escribir
cdigo con las ventajas que proporciona este entorno de ejecucin administrado. El cdigo desarrollado con
un compilador de lenguaje orientado al tiempo de ejecucin se denomina cdigo administrado. Este cdigo se
beneficia de caractersticas como: la integracin entre lenguajes, el control de excepciones entre lenguajes, la
seguridad mejorada, la compatibilidad con la implementacin y las versiones, un modelo simplificado de
interaccin y servicios de creacin de perfiles y depuracin.

Para permitir al motor en tiempo de ejecucin proporcionar servicios al cdigo administrado, los compiladores
de lenguajes deben emitir metadatos que describen los tipos, los miembros y las referencias del cdigo. Los
metadatos se almacenan con el cdigo; cada archivo ejecutable portable (PE) de Common Language Runtime
cargable contiene metadatos. El motor en tiempo de ejecucin utiliza los metadatos para localizar y cargar
clases, colocar instancias en memoria, resolver invocaciones a mtodos, generar cdigo nativo, exigir
mecanismos de seguridad y establecer los lmites del contexto en tiempo de ejecucin.

El tiempo de ejecucin controla automticamente la disposicin de los objetos y administra las referencias a
stos, liberndolos cuando ya no se utilizan. Los objetos cuya duracin se administra de esta forma se
denominan datos administrados. La recoleccin de elementos no utilizados elimina prdidas de memoria, as
como otros errores habituales de programacin. Con un cdigo administrado se pueden utilizar datos
administrados, datos no administrados o estos dos tipos de datos en una aplicacin .NET. Framework. Como
los compiladores de lenguajes proporcionan sus propios tipos, como tipos primitivos, no siempre se sabe (o no
es necesario saber) si los datos se estn administrando.

Common Language Runtime facilita el diseo de los componentes y de las aplicaciones cuyos objetos
interactan entre lenguajes distintos. Los objetos escritos en lenguajes diferentes pueden comunicarse entre
s, lo que permite integrar sus comportamientos de forma precisa. Por ejemplo, puede definir una clase y, a
continuacin, utilizar un lenguaje diferente para derivar una clase de la clase original o llamar a un mtodo de
la clase original. Tambin se puede pasar al mtodo de una clase una instancia de una clase escrita en un
lenguaje diferente. Esta integracin entre lenguajes diferentes es posible porque los compiladores y las
herramientas de lenguajes orientados al motor en tiempo de ejecucin utilizan un sistema de tipos comn
definido por el motor en tiempo de ejecucin, y los lenguajes siguen las reglas en tiempo de ejecucin para
definir nuevos tipos, as como para crear, utilizar, almacenar y enlazar tipos.

Como parte de los metadatos, todos los componentes administrados contienen informacin sobre los
componentes y los recursos utilizados en su creacin. El motor en tiempo de ejecucin utiliza esta informacin
para garantizar que el componente o la aplicacin contiene las versiones especificadas de todo lo necesario,
por lo que hay menos posibilidades de que la ejecucin del cdigo se interrumpa debido a una dependencia
inadecuada. La informacin de registro y los datos de estado ya no se almacenan en el Registro, donde puede
ser difcil establecer y mantener datos. En su lugar, la informacin sobre tipos definidos por el usuario (y sus
dependencias) se almacena con el cdigo como metadatos y, de este modo, las tareas de rplica y
eliminacin de componentes es mucho menos complicada.

Las herramientas y los compiladores de lenguajes exponen la funcionalidad del motor en tiempo de ejecucin
de forma que resulte til e intuitiva para los programadores. Esto significa que algunas caractersticas en
tiempo de ejecucin pueden ser ms evidentes en un entorno que en otro. El funcionamiento del motor en
tiempo de ejecucin depende de las herramientas y los compiladores utilizados. Por ejemplo, un programador
de Visual Basic observar que con Common Language Runtime, el lenguaje Visual Basic contiene ms
caractersticas orientadas a objetos que antes. Algunas de las ventajas del motor en tiempo de ejecucin son:

Mejoras en el rendimiento.

Capacidad para utilizar fcilmente componentes desarrollados en otros lenguajes.

Tipos extensibles que proporciona una biblioteca de clases

Nuevas caractersticas del lenguaje como herencia, interfaces y sobrecarga para la programacin
orientada a objetos; compatibilidad con el uso de subprocesos libres que permite la creacin de
multiprocesos; aplicaciones escalables; compatibilidad con los atributos personalizados y el control de
excepciones estructurado.

Si utiliza Microsoft Visual C++ .NET, puede escribir cdigo administrado utilizando Visual C++, que
proporcionan las ventajas de un entorno de ejecucin administrado, as como el acceso a caractersticas
eficaces y a tipos de datos informativos que ya le resultan familiares. Otras caractersticas del motor en tiempo
de ejecucin son:

Integracin entre lenguajes diferentes y, en especial, herencia entre lenguajes.

Recoleccin de elementos no utilizados, que administra la duracin de los objetos de modo que no es
necesario el recuento de referencias.

Objetos auto descriptivos que hacen innecesario el Lenguaje de definicin de interfaces (IDL).

Capacidad para compilar una vez y ejecutar cdigo en cualquier CPU y sistema operativo que sea
compatible con el motor en tiempo de ejecucin.

Tambin se puede escribir cdigo administrado en lenguaje C#, que proporciona las siguientes ventajas:

Diseo completo orientado a objetos

Seguridad de tipos muy slida

Buena combinacin entre la simplicidad de Visual Basic y la eficacia de C++.

Recoleccin de elementos no utilizados.

Sintaxis y palabras clave similares en C y en C++.

Utilice delegados para una mayor seguridad y proteccin de tipos, en vez de punteros a funciones. Los
punteros a funciones estn disponibles mediante la utilizacin de la palabra clave unsafe de C# y de la
opcin /unsafe del compilador de C# (Csc.exe) para datos y cdigo no administrados.

Biblioteca de clases de .NET Framework

La biblioteca de clases de .NET Framework brinda acceso a la funcionalidad del sistema y es la base sobre la
que se crean las aplicaciones, componentes y controles de .NET Framework. En las secciones siguientes se
describen muchos de los espacios de nombres proporcionados en la biblioteca de clases de .NET Framework.
Para examinar toda la biblioteca de clases de .NET Framework 3.0.

Espacios de nombres de programacin fundamentales

System: contiene clases y clases base que definen los valores y tipos de datos de referencia, eventos
y controladores de eventos, interfaces, atributos y excepciones de procesamiento comnmente
utilizados. Otras clases proporcionan servicios para convertir tipos de datos, manipular parmetros de
mtodos, realizar clculos matemticos, invocar programas remotos y locales, administrar el entorno
de aplicaciones y supervisar aplicaciones administradas y no administradas.

System.Collections: contiene interfaces y clases que definen diversas colecciones de objetos, tales
como listas, colas, matrices, tablas hash y diccionarios.

System.Collections. Generic: contiene interfaces y clases que definen colecciones genricas, las
cuales permiten a los usuarios crear colecciones con establecimiento inflexible de tipos que
proporcionan mayor rendimiento y seguridad de tipos que las colecciones con establecimiento
inflexible de tipos que no son genricas.

System.IO: contiene tipos que permiten lectura y escritura sincrnica y asincrnica en archivos y
secuencias de datos.
System.Text: contiene clases que permiten representar codificaciones de caracteres ASCII, Unicode,
UTF-7 y UTF-8; clases base abstractas para convertir bloques de caracteres a y desde bloques de
bytes; y una clase auxiliar que procesa y da formato a objetos String sin crear instancias intermedias
de dicha clase.

System.Threading: proporciona clases e interfaces que permiten la programacin multiproceso. Este


espacio de nombres incluye una clase ThreadPool que administra grupos de subprocesos, una
clase Timer que permite llamar a un delegado despus de un perodo de tiempo determinado y una
clase Mutex para sincronizar subprocesos mutuamente excluyentes.

Espacios de nombres Configuracin

System.Configuration: contiene clases que se emplean para obtener acceso mediante programacin a
los valores de configuracin de .NET Framework y para controlar los errores de los archivos de
configuracin.

System.Configuration. Assemblies: contiene clases que se utilizan para configurar un ensamblado.

System.Configuration. Install: proporciona clases que permiten escribir instaladores personalizados


para los componentes.

Espacios de nombres Data y XML

System.Data: consiste en las clases que constituyen la arquitectura ADO.NET, que es el mtodo
principal para tener acceso a los datos de las aplicaciones administradas.

System.Data. Common: contiene las clases que comparten los proveedores de datos .NET
Framework. Dichos proveedores describen una coleccin de clases que se utiliza para obtener acceso
a un origen de datos, como una base de datos, en el espacio administrado.

System.Xml: contiene las clases que proporcionan funcionalidad basada en estndares para procesar
cdigo XML.

Espacios de nombres Globalizacin y Localizacin


System.Globalization: contiene clases que definen datos relativos a la referencia cultural, tales como
idioma, pas o regin, calendario, formatos de fecha, moneda y nmeros, as como el criterio de
ordenacin para cadenas.

System.Resources: proporciona clases e interfaces que permiten a los programadores crear,


almacenar y administrar los diversos recursos especficos de la referencia cultural que se utilizan en
una aplicacin.

System.Text: contiene clases que representan los sistemas de codificacin de caracteres ASCII,
Unicode, UTF-7 y UTF-8.

Espacios de nombres Interop

System.Runtime.InteropServices: proporciona una amplia variedad de miembros compatibles con la


interoperabilidad COM y los servicios de invocacin de plataforma.

System.Runtime.InteropServices.ComTypes: contiene mtodos que son definiciones de funciones


COM para cdigo administrado. Estas funciones reemplazan a los mtodos UCOM*, ahora obsoletos,
en el espacio de nombres System.Runtime.InteropServices.

Espacios de nombres Net

System.Net: contiene clases que proporcionan una interfaz simple a muchos protocolos de red.

System.Net.Mail: contiene clases utilizadas para enviar correo electrnico a un servidor SMTP
(Protocolo simple de transferencia de correo) para su entrega.

System.Net.NetworkInformation: proporciona acceso a los datos de trfico de la red, informacin de


direcciones de red y notificacin de cambios de direccin para el equipo local.

System.Net.Sockets: proporciona una implementacin administrada de la interfaz de Windows Sockets


(Winsock) para desarrolladores que necesitan controlar el acceso a la red.

Espacios de nombres Reflection


System.Reflection: contiene clases e interfaces que proporcionan una vista administrada de tipos cargados,
mtodos y campos, con la capacidad de crear y utilizar tipos dinmicamente.

Espacios de nombres Security

System.Security: proporciona la estructura subyacente del sistema de seguridad de Common


Language Runtime, incluidas ciertas clases base relativas a permisos.

System.Web. Security: contiene clases que se utilizan para implementar seguridad ASP.NET en
aplicaciones Web.

Espacios de nombres Serialization

System.Runtime.Serialization: contiene clases que se pueden utilizar para serializar y deserializar


objetos. La serializacin es el proceso de convertir un objeto o un grfico de objetos en una secuencia
lineal de bytes para su almacenamiento o transmisin a otra ubicacin. La deserializacin es el
proceso de volver a generar los objetos a partir de la informacin almacenada.

Espacios de nombres Service

Los espacios de nombres de .NET Framework que permiten interactuar con una serie de recursos de servidor
para servicios de fondo son los siguientes:

System.Diagnostics: consta de una serie de clases que permiten depurar una aplicacin y trazar la
ejecucin del cdigo. System.Diagnostics tambin proporciona clases que permiten iniciar procesos
del sistema, leer y escribir en los registros de eventos y supervisar el rendimiento del sistema mediante
contadores de rendimiento.

System.DirectoryServices: consta de una serie de clases que proporcionan un acceso fcil a Active
Directory desde cdigo administrado.

System.IO: proporciona clases que realizan escuchas a las notificaciones de cambios del sistema de
archivos y provocan eventos cuando se producen cambios en un directorio o en un archivo de un
directorio.

System.Management: proporciona clases para administrar informacin y eventos sobre el sistema, los
dispositivos y las aplicaciones instrumentados para la infraestructura de Windows Management
Instrumentation (WMI).

System.Messaging: proporciona clases que permiten conectarse a colas de mensajes en la red, enviar
mensajes a colas y recibir, o leer sin eliminar (peek), mensajes de las colas.
System.ServiceProcess: proporciona clases que permiten instalar y ejecutar servicios, programas de
duracin prolongada que no poseen interfaz de usuario.

System.Timers: proporciona el componente Timer basado en servidor, el cual permite activar un evento
durante un intervalo especificado.

Lenguaje de programacin

Un lenguaje de programacin" es un lenguaje diseado para describir el conjunto de acciones consecutivas


que un equipo debe ejecutar. Por lo tanto, un lenguaje de programacin es un modo prctico para que los
seres humanos puedan dar instrucciones a un equipo.

Por otro lado, el trmino "lenguaje natural" define un medio de comunicacin compartido por un grupo de
personas (por ejemplo: ingls o francs).

Los lenguajes que los equipos usan para comunicarse entre ellos no tienen nada que ver con los lenguajes de
programacin; se los conoce como protocolos de comunicacin. Se trata de dos conceptos totalmente
diferentes. Un lenguaje de programacin es muy estricto:

A CADA instruccin le corresponde UNA accin de procesador.

El lenguaje utilizado por el procesador se denomina lenguaje mquina. Se trata de datos tal como llegan al
procesador, que consisten en una serie de 0 y 1 ( datos binarios).

El lenguaje mquina, por lo tanto, no es comprensible para los seres humanos, razn por la cual se han
desarrollado lenguajes intermediarios comprensibles para el hombre. El cdigo escrito en este tipo de
lenguaje se transforma en cdigo mquina para que el procesador pueda procesarlo.

El ensamblador fue el primer lenguaje de programacin utilizado. Es muy similar al lenguaje mquina, pero los
desarrolladores pueden comprenderlo. No obstante, este lenguaje se parece tanto al lenguaje mquina que
depende estrictamente del tipo de procesador utilizado (cada tipo de procesador puede tener su propio
lenguaje mquina). As, un programa desarrollado para un equipo no puede ser portado a otro tipo de equipo.
El trmino "portabilidad" describe la capacidad de usar un programa de software en diferentes tipos de
equipos. Para poder utilizar un programa de software escrito en un cdigo ensamblador en otro tipo de equipo,
a veces ser necesario volver a escribir todo el programa!

Por lo tanto, un lenguaje de programacin tiene varias ventajas:

es mucho ms fcil de comprender que un lenguaje mquina:


permite mayor portabilidad, es decir que puede adaptarse fcilmente para ejecutarse en diferentes
tipos de equipos.

Lenguajes de programacin imperativos y funcionales

Los lenguajes de programacin generalmente se dividen en dos grupos principales en base al procesamiento
de sus comandos:

lenguajes imperativos;
lenguajes funcionales.
Lenguaje de programacin imperativo

Un lenguaje imperativo programa mediante una serie de comandos, agrupados en bloques y compuestos de
rdenes condicionales que permiten al programa retornar a un bloque de comandos si se cumple la condicin.
Estos fueron los primeros lenguajes de programacin en uso y an hoy muchos lenguajes modernos usan
este principio.

No obstante, los lenguajes imperativos estructurados carecen de flexibilidad debido a la secuencialidad de las
instrucciones.

Lenguaje de programacin funcional

Un lenguaje de programacin funcional (a menudo llamado lenguaje procedimental) es un lenguaje que crea
programas mediante funciones, devuelve un nuevo estado de resultado y recibe como entrada el resultado de
otras funciones. Cuando una funcin se invoca a s misma, hablamos de recursividad.

Interpretacin y compilacin

Los lenguajes de programacin pueden, en lneas generales, dividirse en dos categoras:

lenguajes interpretados
lenguajes compilados

Lenguaje interpretado

Un lenguaje de programacin es, por definicin, diferente al lenguaje mquina. Por lo tanto, debe traducirse
para que el procesador pueda comprenderlo. Un programa escrito en un lenguaje interpretado requiere de un
programa auxiliar (el intrprete), que traduce los comandos de los programas segn sea necesario.

Lenguaje compilado

Un programa escrito en un lenguaje "compilado" se traduce a travs de un programa anexo


llamado compilador que, a su vez, crea un nuevo archivo independiente que no necesita ningn otro programa
para ejecutarse a s mismo. Este archivo se llama ejecutable.

Un programa escrito en un lenguaje compilado posee la ventaja de no necesitar un programa anexo para ser
ejecutado una vez que ha sido compilado. Adems, como slo es necesaria una traduccin, la ejecucin se
vuelve ms rpida.
Sin embargo, no es tan flexible como un programa escrito en lenguaje interpretado, ya que cada modificacin
del archivo fuente (el archivo comprensible para los seres humanos: el archivo a compilar) requiere de la
compilacin del programa para aplicar los cambios.

Por otra parte, un programa compilado tiene la ventaja de garantizar la seguridad del cdigo fuente. En efecto,
el lenguaje interpretado, al ser directamente un lenguaje legible, hace que cualquier persona pueda conocer
los secretos de fabricacin de un programa y, de ese modo, copiar su cdigo o incluso modificarlo. Por lo
tanto, existe el riesgo de que los derechos de autor no sean respetados. Por otro lado, ciertas aplicaciones
aseguradas necesitan confidencialidad de cdigo para evitar las copias ilegales (transacciones bancarias,
pagos en lnea, comunicaciones seguras...).

Lenguajes intermediarios

Algunos lenguajes pertenecen a ambas categoras (LISP, Java, Python...) dado que el programa escrito en
estos lenguajes puede, en ciertos casos, sufrir una fase de compilacin intermediaria, en un archivo escrito en
un lenguaje ininteligible (por lo tanto, diferente al archivo fuente) y no ejecutable (requerira un intrprete). Los
applets Java, pequeos programas que a menudo se cargan en pginas web, son archivos compilados que
slo pueden ejecutarse dentro de un navegador web (son archivos con la extensin .class).

Algunos ejemplos de lenguajes ampliamente usados

A continuacin, encontrar una breve lista de los lenguajes de programacin actuales:

Lenguaje Principal rea de aplicacin Compilado/interpretado

ADA Tiempo real Lenguaje compilado

BASIC Programacin para fines educativos Lenguaje interpretado

C Programacin de sistema Lenguaje compilado

C++ Programacin de sistema orientado a objeto Lenguaje compilado

Cobol Administracin Lenguaje compilado

Fortran Clculo Lenguaje compilado

Java Programacin orientada a Internet Lenguaje intermediario

MATLAB Clculos matemticos Lenguaje interpretado

Clculos matemticos Clculos matemticos Lenguaje interpretado

LISP Inteligencia artificial Lenguaje intermediario

Pascal Educacin Lenguaje compilado

PHP Desarrollo de sitios web dinmicos Lenguaje interpretado

Inteligencia artificial Inteligencia artificial Lenguaje interpretado

Perl Procesamiento de cadenas de caracteres Lenguaje interpretado

La mayora de los desarrolladores de .NET tenemos algunas nociones bsicas sobre que es el Garbage
Collector (en adelante GC) y para qu sirve. No obstante, con frecuencia pasamos por alto algunos detalles
de su funcionamiento interno que provocan que nuestro cdigo no sea todo lo eficiente y escalable que
debera.

El objetivo del GC es proporcionar una capa de abstraccin para los desarrolladores en cuestiones de manejo
de memoria. Esto introduce una gran ventaja sobre otros lenguajes de programacin en los que el
desarrollador se tiene ocupar por completo de esta tarea. Escribir cdigo que maneje correctamente su
memoria en todas las situaciones no es ni mucho menos trivial, y las posibilidades de introducir bugs en la
aplicacin son mltiples: corrupcin del heap, corrupcin del stack, prdida de memoria, fragmentacin de
memoria etc.

Si bien el GC simplifica la tarea de manejo de memoria para los desarrolladores, no les exime por completo.
Para hacer buen uso de la memoria en .NET es importante conocer como la maneja el GC internamente.
Vayamos por partes.

El GC de .NET es un colector de basura generacional. Esto significa que clasifica los objetos en distintas
generaciones, lo cual le permite realizar colecciones de basura parciales (de una o varias generaciones) y as
evitar hacer siempre colecciones de basura completas de todo el heap de .NET. Esta caracterstica es una de
las ms importantes en cuanto al rendimiento del GC, y permiten que el GC de .NET sea escalable para
aplicaciones de alta concurrencia como por ejemplo aplicaciones ASP.NET.

En el GC de .NET tiene tres generaciones (0, 1 y 2), y todos los objetos se crean en la generacin 0 siempre y
cuando no superen el tamao de 85.000 bytes (enseguida veremos qu pasa con estos objetos). Las
colecciones de basura se desencadenan cuando se intenta reservar memoria para un nuevo objeto y se
sobrepasa el lmite de memoria designado a la generacin en cuestin. Los lmites de memoria asignados a
cada generacin se modifican dinmicamente durante la vida del proceso para adaptarse a los patrones de
reserva de memoria de la aplicacin.

Cuando el GC realiza una coleccin de basura, revisa todos los objetos de la generacin o generaciones
afectadas, y comprueba si estan referenciados. Para que un objeto se consider referenciado, tiene que estar
referenciado por un objeto raz. Los objetos raz son (simplificando un poco):

Threads Todos los objetos referenciados en la pila: variables locales, parmetros, etc.

Strong Reference Objetos estticos, objetos de cach y variables globales.

Weak Reference Aunque los objetos WeakReference no evitan que sus objetos referenciados sean
colectados, se consideran objetos raz.
Pinned Objects Los objetos marcados como Pinned no pueden ser colectados ni movidos por el GC,
y por tanto los objetos a los que estos referencian tampoco pueden ser colectados. Esta tcnica se suele
utilizar para pasar un objeto .NET como referencia a una API nativa (no .NET), de forma que la direccin
de memoria del objeto .NET no cambie hasta que no finalice la llamada a la API. Los objetos deben
permanecer Pinned lo mnimo indispensable dado que pueden causar fragmentacin del heap de .NET.

Objetos que implementan destructor o Finalize() Esta categora la trato en un post separado: Cosas
que deberas saber sobre los destructores en .NET

Los objetos que no estn referenciados sern eliminados por el GC y su espacio en memoria ser liberado, y
los objetos supervivientes a la coleccin sern promocionados a la siguiente generacin con la excepcin de
los objetos en la generacin 2 que ya no pueden promocionar ms. Por ltimo, los huecos de espacio libre
de los objetos eliminados es consolidado de forma que los objetos supervivientes son reubicados en
direcciones de memoria contiguas. Una aplicacin con una ratio de colecciones saludable, suele tener 10
veces ms colecciones de la generacin 0 que de la generacin 1, y 10 veces ms colecciones de la
generacin 1 que de la generacin 2, es decir una ratio de 100:10:1 para GEN 0: GEN 1: GEN 2.

El colector de basura generacional es indispensable para alcanzar el nivel de rendimiento necesario en una
aplicacin de alta concurrencia, y se basa en la siguiente regla heurstica: los objetos que han existido mucho
tiempo, van a seguir existiendo durante mucho tiempo ms. Es decir que, si un objeto ha sobrevivido a dos
colecciones y ha promocionado hasta la generacin 2, lo ms probable es que vaya a seguir sobreviviendo a
colecciones venideras. Por lo tanto, no tiene sentido colectar basura con la misma frecuencia en la generacin
2 que en la 0. Tras haber realizado miles de pruebas de carga con distintos tipos de aplicaciones, esta
presuncin ha resultado ser cierta (casi siempre).

Cmo haca referencia antes, los objetos cuyo tamao es superior a los 85.000 bytes reciben un trato distinto.
Estos objetos se crean en el Large Object Heap (en adelante LOH), tambin conocido a veces como
generacin 3. Por qu necesitamos una generacin o un heap especial para objetos grandes? Bsicamente
por dos motivos.

1) Se asume que los objetos grandes generalmente tienen una vida larga (misma regla heurstica que para
la generacin 2).

2) Los objetos grandes son caros de mover y por este motivo el espacio libre en el LOH no se consolida y
por tanto favorece la fragmentacin de memoria. Por esto los objetos grandes se crean en un heap
especfico.
Cuando se desencadena una coleccin en la generacin 2 o en el LOH, se realiza una coleccin completa (es
decir de las generaciones 0, 1, 2 y LOH). Las colecciones de basura completas son costosas, sobre todo en
cuanto a consumo de CPU, dado que potencialmente hay muchos objetos que revisar y mover una vez se ha
liberado el espacio.

Dicho esto, qu consideraciones debemos tener en cuanto al uso de memoria cuando desarrollamos
aplicaciones .NET? Estas son algunas, pero no dudis en aportar vuestros propios comentarios:

Cuidado con los objetos alojados en el LOH. Siempre que tenga sentido, es deseable reutilizarlos y
mantenerlos referenciados durante toda la vida del proceso.

Cuidado con la concatenacin de cadenas (String) en un bucle, por ejemplo, generando dinmicamente
un XML o un fragmento de HTML. Estas prcticas, si no se implementan correctamente, suelen terminar
en objetos String de gran tamao en el LOH que provocan constantes colecciones de basura completas y
el correspondiente consumo de 100% CPU. Utilizad la claseStringBuilder para esto.

Cuidado con los objetos que cacheamos, y las referencias a otros objetos que estos pueden mantener.
Cachear objetos indirectamente de forma involuntaria es la forma ms frecuente de provocar un memory
leak en aplicaciones .NET.

You might also like