SlideShare une entreprise Scribd logo
Garbage
Collectors
Qué son ?
Cuáles existen?
Y Cómo funcionan ?
By @JuanKRuiz
Únete a la Comunidad C# en
Meetup: jkr.im/csharp-co
Y si quieres participar
activamente, allí mismo solicita
acceso a nuestro
Slack: csharpco.slack.com
Qué es Garbage Collection?
• Automatiza la
administración de
memoria
• Memoria, NO
recursos
• Libera objetos que
ya no están en uso
• Encuentra objetos
que ya no serán
usados en el
Memoria, NO recursos…
Socket
s
DB
Handlers
File
descriptor
s
Device
descriptors
UI
Windows
throw new
TooManyProblems();
Ventajas de usar un GC
Los devs no
somos muy
buenos lidiando
con la basura
Puntero Colgante
Objeto
P1
P2
Objeto
P1
P2
Doble Liberación
Objet
o
P1
P2
Objeto
P1
P2
nuevo
Objeto
P20
P2
nuevo
Objeto
Memory leaks… por memoria inalcanzable
null
P1
P2
Objeto
Objet
o
P1
P2
Objet
o
Objet
o
Objet
o
Objet
o
Objet
o
Desventajas
de usar un GC
Performance: se gasta
cómputo en decidir que
objetos liberar
Objetos++
--Velocidad
Memoria: administrar la
memoria requiere memoria
Cuando hay X memoria requerida
*
5X => GC >= hacerlo manual
3X => GC 17% más lento
* 2005 con
Pero estamos en 2016
• .Net Micro FX
• Java Micro Edition
• Hay variantes de GC en C# ,
especialmente desarrolladas
por el equipo de Mono/Xamarin
como parte de su estrategia
para Mobile
• Apple iOS usa ARC, un
intermedio que le sigue
dejando el trabajo a los devs
• Manual de todas formas será
más rápido
Pero estamos en C#
• Procesamiento del GC en segundo plano
• GC basado en Generaciones
• En .Net CLR hay 2 tipos de GC
• Workstation: Optimizada para escenarios desktop UI
• Server: por defecto en ASP.Net y SQL Server
Garbage Collection en C#
Pedir memoria es muy rápido
• No hay cambios de contexto
• Son llamadas en modo usuario
• Pocas veces llamadas al kernel por
parte del CLR.
Liberar memoria no tan rápido
• Hay que determinar si los objetos
están en uso
• Liberar objetos en desuso
• Compactar memoria
• Mover objetos entre listas
JEY
GUAT ?
• Compactar memoria
• Mover objetos entre listas
Que hay
adentro?
Compactar memoria
(heap)
Memoria Antes y
después de
compactar
NextObjPtr ->
Address 0x2030 Objeto Vivo (15)
Address 0x2010 Objeto Vivo (14)
Address 0x1070 Objeto Vivo (13)
Address 0x1060 Objeto Muerto (12) NextObjPtr ->
Address 0x1050 Objeto Muerto (11) Address 0x1050 Objeto Vivo (15)
Address 0x1040 Objeto Vivo (10) Address 0x1040 Objeto Vivo (14)
Address 0x1030 Objeto Vivo (9) Address 0x1030 Objeto Vivo (13)
Address 0x1020 Objeto Vivo (8) Address 0x1020 Objeto Vivo (10)
Address 0x0950 Objeto Muerto (7) Address 0x0950 Objeto Vivo (9)
Address 0x0945 Objeto Vivo (6) Address 0x0945 Objeto Vivo (8)
Address 0x0940 Objeto Vivo (5) Address 0x0940 Objeto Vivo (6)
Address 0x0890 Objeto Vivo (4) Address 0x0890 Objeto Vivo (5)
Address 0x0877 Objeto Muerto (3) Address 0x0877 Objeto Vivo (4)
Address 0x0863 Objeto Vivo (2) Address 0x0863 Objeto Vivo (2)
Address 0x0800 Objeto Vivo (1) Address 0x0800 Objeto Vivo (1)
Memoria Libre
Memoria Libre
Recolección
en 3 pasos
Memoria Libre
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Muerto (12)
Objeto Muerto (11)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
Aplicando
GC en G1
Memoria Libre
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
1. Objetos
muertos,
son
liberados
Aplicando
GC en G1
Memoria Libre
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
2. Memoria
es
compactada
Aplicando
GC en G1
3. Cambio de
generación
Memoria Libre
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Muerto (12)
Objeto Muerto (11)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
Memoria Libre
Nuevo obj Vivo (17)
Nuevo obj Vivo (16)
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Aplicando
GC en G2
Memoria Libre
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Muerto (12)
Objeto Muerto (11)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
Memoria Libre
Nuevo obj Vivo (17)
Nuevo obj Vivo (16)
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (10)
Objeto Vivo (9)
Objeto Vivo (8)
Objeto Muerto (7)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Se ejecuta
recolección
en G2 y
luego en G1
Aplicando
GC en G2
Gen 0
Gen 2
Recolección
en G2
Memoria Libre
Nuevo Obj (17)
Nuevo Obj (16)
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (8)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Aplicando
GC en G2 Gen 1
Gen 2
Recolección
en G1
Memoria Libre
Nuevo Obj (16)
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (8)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Aplicando
GC en G3
Recolección
en G3, G2,
G1
Memoria Libre
Nuevo Obj (20)
Nuevo Obj (19)
Nuevo Obj (18)
Objeto Vivo (15)
Objeto Vivo (14)
Objeto Vivo (13)
Objeto Vivo (8)
Objeto Vivo (6)
Objeto Vivo (5)
Objeto Vivo (4)
Objeto Muerto (3)
Objeto Vivo (2)
Objeto Vivo (1)
Gen 0
Gen 1
Gen 2
Aplicando
GC en G3
Todo hecho
Gen 0
Gen 1
Gen 2
Memoria Libre
Nuevo Obj (22)
Nuevo Obj (21)
Nuevo Obj (20)
Nuevo Obj (18)
Objeto Vivo (14)
Objeto Vivo (8)
Objeto Vivo (6)
Objeto Vivo (2)
LOH => Large Object Heap y el límite
de los Todo lo que
vimos aplica
para objetos
<= 85.000
bytes que
están en el
SMO
Large Object Heap
Ejemplo
EHLO Worldtest
data
MyClassOb
j
SOH LOH
byte
[86000]
En el LOH No hay compactación
Memoria Libre Memoria Libre Memoria Libre Memoria Libre
new Large Ob8
Large Ob6 Large Ob6 Large Ob6 Large Ob6 Large Ob6
Large Ob5 Large Ob5 Large Ob5 Memoria Libre Memoria Libre
Large Ob4 Large Ob4 Large Ob4 Large Ob4 Large Ob4
Large Ob3 Memoria Libre new Large Ob7 new Large Ob7 new Large Ob7
Large Ob2 Large Ob2 Large Ob2 Large Ob2 Large Ob2
Large Ob1 Large Ob1 Large Ob1 Memoria Libre Memoria Libre
• El GC del LOH
se ejecuta en
el GC del Gen2
• El LOH no está
alineado en
memoria, y
crece por
demanda
Cuando se ejecuta el GC?
• Cuando el tamaño de los objetos en alguna
generación alcanza su límite
• Gen 0 : ~ 256 K
• Gen 1 : ~ 2 MB
• Gen 2 : ~10 MB
• Cuando se usa GC.Collect() [ se crea una
petición, no una orden ] NO LO USEN SINO
SABEN
• El OS envía una notificación de poca
memoria
Otros GC
Variantes del GC en .Net FX
Workstation:
• non-concurrent
• concurrent: desde .net 4 se reemplazo
por background GC
Server:
• non-concurrent
• desde .net 4.5 soporta background GC
Workstation GC
• La recolección sucede en un el mismo user
thread que inicio el GC. Conserva la
misma prioridad
• El Gc compite con otros threads por
tiempo de CPU
• Threads con código nativo no son
suspendidos
• Si el hardware es de un solo procesador
siempre se usa este GC aunque este
Server GC
• La recolección sucede en múltiples hilos
corriendo en THREAD_PRIORITY_HIGHEST
• Dado que cada CPU tiene su Heap, se
requiere un GC x CPU (SOH + LOH)
• Los tamaños de segmentos son mayores en
server
• La carga de CPU en server es mayor
• * hoy en día los Workstation también tienen mucha
memoria y muchos procesadores
Background GC en WStations
• Solo aplica a generación 2, lanza un hilo
para hacer collection en Gen0 y Gen1
mientras ocurre Gen2.
• Si en el proceso se habían lanzado
Collection normales (foreground) todos
los thread se suspenden, al finalizar
todos continúan incluyendo el bkground
GC.
Background GC en Server
• Lanza un GC thread por cada procesador
lógico
• Al parecer el thread GC lanzado en
Wstation puede hacer time out en ciertos
escenarios, en server ninguno de estos
threads hace timeout.
• Ahora esta es la configuración por
defecto en server
SGen
• Mono
• Usable en Mobile, desktop y server
Cambios de generación en SGen
Nursery Collection
• El tamaño de Nursery es 4mb, al
llenarse este heap el GC inicia un
nursery-collection
• Se suspenden los hilos
• Los objetos ‘vivos’ se mueven al
Mayor Heap, y en el proceso Nursery
queda vacío
Mayor heap Collection
• El tamaño del Mayor Heap es variable,
pero configurable
• Tamaño por defecto 512 MB
• Al llenarse este heap el GC inicia un
mayor-collection
• Sino se logra obtener memoria
suficiente el GC solicita más memoria
al Host OS
Large Object Space
• Objetos mayores a 8.000 bytes (~8k)
nunca se envían al nursery y por ende
nunca van al mayor heap
SGEN_MAX_SMALL_OBJ_SIZE
• Estos objetos van al Large Object
Space
• Son rastreados por el LOS Manager
Variantes del GC en Sgen para el Mayor Heap
Copying Collector:
• Funciona igual al nursery-Collection,
mueve (aka compacta) los objetos para
desfagmentar memoria
• El problema es que muchos objetos
‘viejos’ al moverse liberan muy poca
memoria y no justifica el tiempo de
computo
Variantes del GC en Sgen para el Mayor Heap
Mark and sweep/copying collector:
• No mueve los obj.
• Desde su creación los agrupa en
contenedores según el tamaño
• Si llega al 66% de fragmentación ejecuta
copying-collector
• Se puede cambiar y deshabilitar colection
por por parámetro : evacuation-threshold
Un paso más lejos
• Weak and Strong
References, Resurrection
• IDisposable
• Finalizers
• Recibir notificaciones de
Full GC
Contacto
Juan Carlos Ruiz
SR Technical
Evangelist
@JuanKRuiz
JuanKDev
http://juank.io
JuanKSolocodigo
JuanKRuiz
Únete a la Comunidad C# en
Meetup: jkr.im/csharp-co
Y si quieres participar
activamente, allí mismo solicita
acceso a nuestro
Slack: csharpco.slack.com

Contenu connexe

Similaire à Hangout: Garbage Collectors: Qué son, Cómo funcionan y Cuáles existen

Presentación Detección de Memory Leaks en Android
Presentación Detección de Memory Leaks en AndroidPresentación Detección de Memory Leaks en Android
Presentación Detección de Memory Leaks en Android
Rafael David Piernagorda Albañil
 
Escalando hasta las 10.000 peticiones por segundo
Escalando hasta las 10.000 peticiones por segundoEscalando hasta las 10.000 peticiones por segundo
Escalando hasta las 10.000 peticiones por segundo
TAPTAP Networks
 
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | DevelopersSergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
Smash Tech
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
Jorge Alberto Rodríguez Suárez
 
JRuby Al Rescate J2EE
JRuby Al Rescate J2EEJRuby Al Rescate J2EE
JRuby Al Rescate J2EE
Jorge Alberto Rodríguez Suárez
 
Garbage Collection en el JVM
Garbage Collection en el JVMGarbage Collection en el JVM
Garbage Collection en el JVM
superserch
 
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
Jano González
 
Aplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con RedisAplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con Redis
Alberto Gimeno
 
Presentación Taller ROS - Robotic Operating System
Presentación Taller ROS - Robotic Operating SystemPresentación Taller ROS - Robotic Operating System
Presentación Taller ROS - Robotic Operating System
Bruno Faúndez
 
Memoria 3
Memoria 3Memoria 3
Memoria 3
Ichinose 11
 
Pyrapidc
PyrapidcPyrapidc
Pyrapidc
Matias Lang
 
Bigdataparaprincipiantes 140428183955-phpapp02-1
Bigdataparaprincipiantes 140428183955-phpapp02-1Bigdataparaprincipiantes 140428183955-phpapp02-1
Bigdataparaprincipiantes 140428183955-phpapp02-1
Marta Navarro Gonzalez
 
Big data para principiantes
Big data para principiantesBig data para principiantes
Big data para principiantes
Carlos Toxtli
 
OpenNebula TechDay - inLab
OpenNebula TechDay - inLabOpenNebula TechDay - inLab
OpenNebula TechDay - inLab
OpenNebula Project
 
ONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de BarcelonaONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de Barcelona
CSUC - Consorci de Serveis Universitaris de Catalunya
 
Javascript
JavascriptJavascript

Similaire à Hangout: Garbage Collectors: Qué son, Cómo funcionan y Cuáles existen (16)

Presentación Detección de Memory Leaks en Android
Presentación Detección de Memory Leaks en AndroidPresentación Detección de Memory Leaks en Android
Presentación Detección de Memory Leaks en Android
 
Escalando hasta las 10.000 peticiones por segundo
Escalando hasta las 10.000 peticiones por segundoEscalando hasta las 10.000 peticiones por segundo
Escalando hasta las 10.000 peticiones por segundo
 
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | DevelopersSergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
JRuby Al Rescate J2EE
JRuby Al Rescate J2EEJRuby Al Rescate J2EE
JRuby Al Rescate J2EE
 
Garbage Collection en el JVM
Garbage Collection en el JVMGarbage Collection en el JVM
Garbage Collection en el JVM
 
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
 
Aplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con RedisAplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con Redis
 
Presentación Taller ROS - Robotic Operating System
Presentación Taller ROS - Robotic Operating SystemPresentación Taller ROS - Robotic Operating System
Presentación Taller ROS - Robotic Operating System
 
Memoria 3
Memoria 3Memoria 3
Memoria 3
 
Pyrapidc
PyrapidcPyrapidc
Pyrapidc
 
Bigdataparaprincipiantes 140428183955-phpapp02-1
Bigdataparaprincipiantes 140428183955-phpapp02-1Bigdataparaprincipiantes 140428183955-phpapp02-1
Bigdataparaprincipiantes 140428183955-phpapp02-1
 
Big data para principiantes
Big data para principiantesBig data para principiantes
Big data para principiantes
 
OpenNebula TechDay - inLab
OpenNebula TechDay - inLabOpenNebula TechDay - inLab
OpenNebula TechDay - inLab
 
ONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de BarcelonaONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de Barcelona
 
Javascript
JavascriptJavascript
Javascript
 

Plus de Juan Carlos Ruiz Pacheco

Server less y un poco de azure functions
Server less y un poco de azure functionsServer less y un poco de azure functions
Server less y un poco de azure functions
Juan Carlos Ruiz Pacheco
 
BlockChain, Bitcoin y Azure Blockchain
BlockChain, Bitcoin y Azure BlockchainBlockChain, Bitcoin y Azure Blockchain
BlockChain, Bitcoin y Azure Blockchain
Juan Carlos Ruiz Pacheco
 
Introducción a Microsoft Bot Framework
Introducción a Microsoft Bot FrameworkIntroducción a Microsoft Bot Framework
Introducción a Microsoft Bot Framework
Juan Carlos Ruiz Pacheco
 
Desarrollo de aplicaciones en plataformas no microsoft
Desarrollo de aplicaciones en plataformas no microsoftDesarrollo de aplicaciones en plataformas no microsoft
Desarrollo de aplicaciones en plataformas no microsoft
Juan Carlos Ruiz Pacheco
 
Quiero crear una app ¿Para quién? ¿Para qué?
Quiero crear una app ¿Para quién? ¿Para qué?Quiero crear una app ¿Para quién? ¿Para qué?
Quiero crear una app ¿Para quién? ¿Para qué?
Juan Carlos Ruiz Pacheco
 
Windows phone 8 kit de herramientas
Windows phone 8   kit de herramientasWindows phone 8   kit de herramientas
Windows phone 8 kit de herramientas
Juan Carlos Ruiz Pacheco
 
Windows Phone : cool apps design
Windows Phone : cool apps designWindows Phone : cool apps design
Windows Phone : cool apps design
Juan Carlos Ruiz Pacheco
 
Windows Phone (8) ♬
Windows Phone (8) ♬Windows Phone (8) ♬
Windows Phone (8) ♬
Juan Carlos Ruiz Pacheco
 
Almacenamiento masivo en windows azure
Almacenamiento masivo en windows azureAlmacenamiento masivo en windows azure
Almacenamiento masivo en windows azure
Juan Carlos Ruiz Pacheco
 
Apps & cloud hackeando el mercado de las grandes casas de software
Apps & cloud  hackeando el mercado de las grandes casas de softwareApps & cloud  hackeando el mercado de las grandes casas de software
Apps & cloud hackeando el mercado de las grandes casas de software
Juan Carlos Ruiz Pacheco
 
Súbete al metro de microsoft kinect y windows phone 7
Súbete al metro de microsoft kinect y windows phone 7Súbete al metro de microsoft kinect y windows phone 7
Súbete al metro de microsoft kinect y windows phone 7
Juan Carlos Ruiz Pacheco
 
Como hacer sus sitios web más usables con Internet Explorer 9 y 10
Como hacer sus sitios web más usables con Internet Explorer 9 y 10Como hacer sus sitios web más usables con Internet Explorer 9 y 10
Como hacer sus sitios web más usables con Internet Explorer 9 y 10
Juan Carlos Ruiz Pacheco
 

Plus de Juan Carlos Ruiz Pacheco (12)

Server less y un poco de azure functions
Server less y un poco de azure functionsServer less y un poco de azure functions
Server less y un poco de azure functions
 
BlockChain, Bitcoin y Azure Blockchain
BlockChain, Bitcoin y Azure BlockchainBlockChain, Bitcoin y Azure Blockchain
BlockChain, Bitcoin y Azure Blockchain
 
Introducción a Microsoft Bot Framework
Introducción a Microsoft Bot FrameworkIntroducción a Microsoft Bot Framework
Introducción a Microsoft Bot Framework
 
Desarrollo de aplicaciones en plataformas no microsoft
Desarrollo de aplicaciones en plataformas no microsoftDesarrollo de aplicaciones en plataformas no microsoft
Desarrollo de aplicaciones en plataformas no microsoft
 
Quiero crear una app ¿Para quién? ¿Para qué?
Quiero crear una app ¿Para quién? ¿Para qué?Quiero crear una app ¿Para quién? ¿Para qué?
Quiero crear una app ¿Para quién? ¿Para qué?
 
Windows phone 8 kit de herramientas
Windows phone 8   kit de herramientasWindows phone 8   kit de herramientas
Windows phone 8 kit de herramientas
 
Windows Phone : cool apps design
Windows Phone : cool apps designWindows Phone : cool apps design
Windows Phone : cool apps design
 
Windows Phone (8) ♬
Windows Phone (8) ♬Windows Phone (8) ♬
Windows Phone (8) ♬
 
Almacenamiento masivo en windows azure
Almacenamiento masivo en windows azureAlmacenamiento masivo en windows azure
Almacenamiento masivo en windows azure
 
Apps & cloud hackeando el mercado de las grandes casas de software
Apps & cloud  hackeando el mercado de las grandes casas de softwareApps & cloud  hackeando el mercado de las grandes casas de software
Apps & cloud hackeando el mercado de las grandes casas de software
 
Súbete al metro de microsoft kinect y windows phone 7
Súbete al metro de microsoft kinect y windows phone 7Súbete al metro de microsoft kinect y windows phone 7
Súbete al metro de microsoft kinect y windows phone 7
 
Como hacer sus sitios web más usables con Internet Explorer 9 y 10
Como hacer sus sitios web más usables con Internet Explorer 9 y 10Como hacer sus sitios web más usables con Internet Explorer 9 y 10
Como hacer sus sitios web más usables con Internet Explorer 9 y 10
 

Dernier

Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
PaulDelgadoSoto
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
eliersin13
 

Dernier (7)

Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
 

Hangout: Garbage Collectors: Qué son, Cómo funcionan y Cuáles existen

  • 1. Garbage Collectors Qué son ? Cuáles existen? Y Cómo funcionan ? By @JuanKRuiz
  • 2. Únete a la Comunidad C# en Meetup: jkr.im/csharp-co Y si quieres participar activamente, allí mismo solicita acceso a nuestro Slack: csharpco.slack.com
  • 3. Qué es Garbage Collection? • Automatiza la administración de memoria • Memoria, NO recursos • Libera objetos que ya no están en uso • Encuentra objetos que ya no serán usados en el
  • 6. Los devs no somos muy buenos lidiando con la basura
  • 9. Memory leaks… por memoria inalcanzable null P1 P2 Objeto Objet o P1 P2 Objet o Objet o Objet o Objet o Objet o
  • 11. Performance: se gasta cómputo en decidir que objetos liberar Objetos++ --Velocidad
  • 12. Memoria: administrar la memoria requiere memoria Cuando hay X memoria requerida * 5X => GC >= hacerlo manual 3X => GC 17% más lento * 2005 con
  • 13. Pero estamos en 2016 • .Net Micro FX • Java Micro Edition • Hay variantes de GC en C# , especialmente desarrolladas por el equipo de Mono/Xamarin como parte de su estrategia para Mobile • Apple iOS usa ARC, un intermedio que le sigue dejando el trabajo a los devs • Manual de todas formas será más rápido
  • 14. Pero estamos en C# • Procesamiento del GC en segundo plano • GC basado en Generaciones • En .Net CLR hay 2 tipos de GC • Workstation: Optimizada para escenarios desktop UI • Server: por defecto en ASP.Net y SQL Server
  • 16. Pedir memoria es muy rápido • No hay cambios de contexto • Son llamadas en modo usuario • Pocas veces llamadas al kernel por parte del CLR.
  • 17. Liberar memoria no tan rápido • Hay que determinar si los objetos están en uso • Liberar objetos en desuso • Compactar memoria • Mover objetos entre listas
  • 18. JEY GUAT ? • Compactar memoria • Mover objetos entre listas
  • 20. Compactar memoria (heap) Memoria Antes y después de compactar NextObjPtr -> Address 0x2030 Objeto Vivo (15) Address 0x2010 Objeto Vivo (14) Address 0x1070 Objeto Vivo (13) Address 0x1060 Objeto Muerto (12) NextObjPtr -> Address 0x1050 Objeto Muerto (11) Address 0x1050 Objeto Vivo (15) Address 0x1040 Objeto Vivo (10) Address 0x1040 Objeto Vivo (14) Address 0x1030 Objeto Vivo (9) Address 0x1030 Objeto Vivo (13) Address 0x1020 Objeto Vivo (8) Address 0x1020 Objeto Vivo (10) Address 0x0950 Objeto Muerto (7) Address 0x0950 Objeto Vivo (9) Address 0x0945 Objeto Vivo (6) Address 0x0945 Objeto Vivo (8) Address 0x0940 Objeto Vivo (5) Address 0x0940 Objeto Vivo (6) Address 0x0890 Objeto Vivo (4) Address 0x0890 Objeto Vivo (5) Address 0x0877 Objeto Muerto (3) Address 0x0877 Objeto Vivo (4) Address 0x0863 Objeto Vivo (2) Address 0x0863 Objeto Vivo (2) Address 0x0800 Objeto Vivo (1) Address 0x0800 Objeto Vivo (1) Memoria Libre Memoria Libre
  • 21. Recolección en 3 pasos Memoria Libre Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Muerto (12) Objeto Muerto (11) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2
  • 22. Aplicando GC en G1 Memoria Libre Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2 1. Objetos muertos, son liberados
  • 23. Aplicando GC en G1 Memoria Libre Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2 2. Memoria es compactada
  • 24. Aplicando GC en G1 3. Cambio de generación Memoria Libre Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Muerto (12) Objeto Muerto (11) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2 Memoria Libre Nuevo obj Vivo (17) Nuevo obj Vivo (16) Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1)
  • 25. Aplicando GC en G2 Memoria Libre Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Muerto (12) Objeto Muerto (11) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2 Memoria Libre Nuevo obj Vivo (17) Nuevo obj Vivo (16) Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (10) Objeto Vivo (9) Objeto Vivo (8) Objeto Muerto (7) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Se ejecuta recolección en G2 y luego en G1
  • 26. Aplicando GC en G2 Gen 0 Gen 2 Recolección en G2 Memoria Libre Nuevo Obj (17) Nuevo Obj (16) Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (8) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1)
  • 27. Aplicando GC en G2 Gen 1 Gen 2 Recolección en G1 Memoria Libre Nuevo Obj (16) Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (8) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1)
  • 28. Aplicando GC en G3 Recolección en G3, G2, G1 Memoria Libre Nuevo Obj (20) Nuevo Obj (19) Nuevo Obj (18) Objeto Vivo (15) Objeto Vivo (14) Objeto Vivo (13) Objeto Vivo (8) Objeto Vivo (6) Objeto Vivo (5) Objeto Vivo (4) Objeto Muerto (3) Objeto Vivo (2) Objeto Vivo (1) Gen 0 Gen 1 Gen 2
  • 29. Aplicando GC en G3 Todo hecho Gen 0 Gen 1 Gen 2 Memoria Libre Nuevo Obj (22) Nuevo Obj (21) Nuevo Obj (20) Nuevo Obj (18) Objeto Vivo (14) Objeto Vivo (8) Objeto Vivo (6) Objeto Vivo (2)
  • 30. LOH => Large Object Heap y el límite de los Todo lo que vimos aplica para objetos <= 85.000 bytes que están en el SMO
  • 33. En el LOH No hay compactación Memoria Libre Memoria Libre Memoria Libre Memoria Libre new Large Ob8 Large Ob6 Large Ob6 Large Ob6 Large Ob6 Large Ob6 Large Ob5 Large Ob5 Large Ob5 Memoria Libre Memoria Libre Large Ob4 Large Ob4 Large Ob4 Large Ob4 Large Ob4 Large Ob3 Memoria Libre new Large Ob7 new Large Ob7 new Large Ob7 Large Ob2 Large Ob2 Large Ob2 Large Ob2 Large Ob2 Large Ob1 Large Ob1 Large Ob1 Memoria Libre Memoria Libre • El GC del LOH se ejecuta en el GC del Gen2 • El LOH no está alineado en memoria, y crece por demanda
  • 34. Cuando se ejecuta el GC? • Cuando el tamaño de los objetos en alguna generación alcanza su límite • Gen 0 : ~ 256 K • Gen 1 : ~ 2 MB • Gen 2 : ~10 MB • Cuando se usa GC.Collect() [ se crea una petición, no una orden ] NO LO USEN SINO SABEN • El OS envía una notificación de poca memoria
  • 36. Variantes del GC en .Net FX Workstation: • non-concurrent • concurrent: desde .net 4 se reemplazo por background GC Server: • non-concurrent • desde .net 4.5 soporta background GC
  • 37. Workstation GC • La recolección sucede en un el mismo user thread que inicio el GC. Conserva la misma prioridad • El Gc compite con otros threads por tiempo de CPU • Threads con código nativo no son suspendidos • Si el hardware es de un solo procesador siempre se usa este GC aunque este
  • 38. Server GC • La recolección sucede en múltiples hilos corriendo en THREAD_PRIORITY_HIGHEST • Dado que cada CPU tiene su Heap, se requiere un GC x CPU (SOH + LOH) • Los tamaños de segmentos son mayores en server • La carga de CPU en server es mayor • * hoy en día los Workstation también tienen mucha memoria y muchos procesadores
  • 39. Background GC en WStations • Solo aplica a generación 2, lanza un hilo para hacer collection en Gen0 y Gen1 mientras ocurre Gen2. • Si en el proceso se habían lanzado Collection normales (foreground) todos los thread se suspenden, al finalizar todos continúan incluyendo el bkground GC.
  • 40. Background GC en Server • Lanza un GC thread por cada procesador lógico • Al parecer el thread GC lanzado en Wstation puede hacer time out en ciertos escenarios, en server ninguno de estos threads hace timeout. • Ahora esta es la configuración por defecto en server
  • 41. SGen • Mono • Usable en Mobile, desktop y server
  • 43. Nursery Collection • El tamaño de Nursery es 4mb, al llenarse este heap el GC inicia un nursery-collection • Se suspenden los hilos • Los objetos ‘vivos’ se mueven al Mayor Heap, y en el proceso Nursery queda vacío
  • 44. Mayor heap Collection • El tamaño del Mayor Heap es variable, pero configurable • Tamaño por defecto 512 MB • Al llenarse este heap el GC inicia un mayor-collection • Sino se logra obtener memoria suficiente el GC solicita más memoria al Host OS
  • 45. Large Object Space • Objetos mayores a 8.000 bytes (~8k) nunca se envían al nursery y por ende nunca van al mayor heap SGEN_MAX_SMALL_OBJ_SIZE • Estos objetos van al Large Object Space • Son rastreados por el LOS Manager
  • 46. Variantes del GC en Sgen para el Mayor Heap Copying Collector: • Funciona igual al nursery-Collection, mueve (aka compacta) los objetos para desfagmentar memoria • El problema es que muchos objetos ‘viejos’ al moverse liberan muy poca memoria y no justifica el tiempo de computo
  • 47. Variantes del GC en Sgen para el Mayor Heap Mark and sweep/copying collector: • No mueve los obj. • Desde su creación los agrupa en contenedores según el tamaño • Si llega al 66% de fragmentación ejecuta copying-collector • Se puede cambiar y deshabilitar colection por por parámetro : evacuation-threshold
  • 48. Un paso más lejos • Weak and Strong References, Resurrection • IDisposable • Finalizers • Recibir notificaciones de Full GC
  • 49. Contacto Juan Carlos Ruiz SR Technical Evangelist @JuanKRuiz JuanKDev http://juank.io JuanKSolocodigo JuanKRuiz
  • 50. Únete a la Comunidad C# en Meetup: jkr.im/csharp-co Y si quieres participar activamente, allí mismo solicita acceso a nuestro Slack: csharpco.slack.com

Notes de l'éditeur

  1. El tema del rendimiento de los GC y la capacidad de algunos dispositivos llevaron a Apple a no adoptar GC en iOS pese a la solicitud de los desarrolladores iOS 10.5 /2007 introdujo un GC iOS 10.8/2012 lo eliminó y lo reemplazo por un LLVM/ARC (Automatic Reference Counting)
  2. No hay cambios de contexto, pues la memoria se le pide al CLR y hace parte del managed heap, que previamente ha pedido una buena porción al host OS. Es decir son llamadas en modo usuario, pocas llamadas al kernel por parte del CLR.
  3. No hay cambios de contexto, pues la memoria se le pide al CLR y hace parte del managed heap, que previamente ha pedido una buena porción al host OS. Es decir son llamadas en modo usuario, pocas llamadas al kernel por parte del CLR.
  4. No hay cambios de contexto, pues la memoria se le pide al CLR y hace parte del managed heap, que previamente ha pedido una buena porción al host OS. Es decir son llamadas en modo usuario, pocas llamadas al kernel por parte del CLR.
  5. 85k parece poco, pero por ejemplo una lista de datos con miles de registros puede tener en total varios megas de tamaño, pero la lista como tal solo unos pocos K porque la lista solo contiene referencias (punteros de 32 o 64 bit ) a objetos más pequeños. Es decir este limite aplica en mayoría de casos para cosas como imágenes o archivos cargados en memoria, o listas inmensas, u objetos que por X o Y llegan a ser enormes.
  6. Un array de double[1000] = puede irse al LOH por cuestiones de aprovechar mejor performance, alinemiento de bytes