Your SlideShare is downloading. ×
0
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Ruby & GCs (versão 2.1.2) - VI Secot UFScar Sorocaba

5,151

Published on

Versão 2.1.2 da palestra que apresentei na QCon 2014 e reapresentada na VI Secot da UFScar Sorocaba.

Versão 2.1.2 da palestra que apresentei na QCon 2014 e reapresentada na VI Secot da UFScar Sorocaba.

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,151
On Slideshare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
18
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Ruby & GCs Entendendo Gerenciamento de Memória
  • 2. "G1 GC is an incremental parallel compacting GC that provides more predictable pause times compared to CMS GC and Parallel Old GC. By introducing a parallel, concurrent and multi- phased marking cycle, G1 GC can work with much larger heaps while providing reasonable worst-case pause times."
  • 3. "G1 GC is an incremental parallel compacting GC that provides more predictable pause times compared to CMS GC and Parallel Old GC. By introducing a parallel, concurrent and multi- phased marking cycle, G1 GC can work with much larger heaps while providing reasonable worst-case pause times."
  • 4. Obsoletos 1.8.6 1.8.7 1.9.2
  • 5. Obsoletos 1.8.6 1.8.7 1.9.2 Atuais 1.9.3 2.0.0 2.1.2
  • 6. Alocação de Memória malloc() Limpeza de Lixo free()
  • 7. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 8. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 9. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 10. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 11. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 12. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; } 0000 0000 0000 0000 0000 0000 0001 1001
  • 13. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; } 0000 0000 0000 0000 0000 0000 0001 1001
  • 14. #include<stdio.h> int main() { int *ptr_one; ! ptr_one = (int *)malloc(sizeof(int)); ! if (ptr_one == 0) { printf("ERROR: Out of memoryn"); return 1; } ! *ptr_one = 25; printf("%dn", *ptr_one); ! free(ptr_one); ! return 0; }
  • 15. Alocação de Memória malloc() Detecção de Lixo ? Limpeza de Lixo free()
  • 16. 40 bytes livres
  • 17. Slot (40 bytes) Heap (ex 6 slots)
  • 18. Slot (40 bytes) Heap (ex 6 slots) Instância de RVALUE
  • 19. typedef struct RVALUE { union { struct { VALUE flags; /* always 0 for freed obj */ struct RVALUE *next; } free; struct RBasic basic; struct RObject object; struct RClass klass; struct RFloat flonum; struct RString string; struct RArray array; struct RRegexp regexp; struct RHash hash; struct RData data; struct RTypedData typeddata; struct RStruct rstruct; struct RBignum bignum; struct RFile file; struct RNode node; struct RMatch match; struct RRational rational; struct RComplex complex; struct { struct RBasic basic; VALUE v1; VALUE v2; VALUE v3; } values; } as; #if GC_DEBUG const char *file; VALUE line; #endif } RVALUE; RVALUE
  • 20. typedef struct RVALUE { union { struct { VALUE flags; /* always 0 for freed obj */ struct RVALUE *next; } free; struct RBasic basic; struct RObject object; struct RClass klass; struct RFloat flonum; struct RString string; struct RArray array; struct RRegexp regexp; struct RHash hash; struct RData data; struct RTypedData typeddata; struct RStruct rstruct; struct RBignum bignum; struct RFile file; struct RNode node; struct RMatch match; struct RRational rational; struct RComplex complex; struct { struct RBasic basic; VALUE v1; VALUE v2; VALUE v3; } values; } as; #if GC_DEBUG const char *file; VALUE line; #endif } RVALUE; RVALUE struct RString { struct RBasic basic; union { struct { long len; char *ptr; union { long capa; VALUE shared; } aux; } heap; char ary[RSTRING_EMBED_LEN_MAX + 1]; } as; }; RSTRING(str)->as.heap.ptr
  • 21. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 22. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 23. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 24. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 25. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 26. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 27. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 28. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 29. Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE
  • 30. Mark and Sweep GC Full Marking and Full Sweep GC
  • 31. • Slots de mesmo tamanho (não há problema com fragmentação)
  • 32. • Slots de mesmo tamanho (não há problema com fragmentação) • Quanto mais heaps, mais lento • Fase de marcação conservadora
  • 33. • Slots de mesmo tamanho (não há problema com fragmentação) • Quanto mais heaps, mais lento • Fase de marcação conservadora • pode haver “leaks” (ex. constantes)
  • 34. • Slots de mesmo tamanho (não há problema com fragmentação) • Quanto mais heaps, mais lento • Fase de marcação conservadora • pode haver “leaks” (ex. constantes) • Processo “Stop-the-World"
  • 35. Master Unicorn ou Passenger Rails App NGINX request 150mb
  • 36. Master Unicorn ou Passenger Rails App NGINX Rails App fork() request 150mb 150mb
  • 37. Master Unicorn ou Passenger Rails App NGINX Rails App Rails App fork() fork() request 150mb 150mb 150mb
  • 38. Copy on Write (CoW) só copia o trecho da memória quando for modificada
  • 39. “Mark Bit Map”
  • 40. “Mark Bit Map”
  • 41. “Mark Bit Map”
  • 42. “Mark Bit Map”
  • 43. “Mark Bit Map”
  • 44. Bitmap Marking GC Full Bitmap Marking and Full Sweep GC
  • 45. Master Unicorn ou Passenger Rails App NGINX request 150mb
  • 46. Master Unicorn ou Passenger Rails App NGINX Rails App fork() request 150mb 100mb
  • 47. Master Unicorn ou Passenger Rails App NGINX Rails App Rails App fork() fork() request 150mb 100mb 100mb
  • 48. Mark Sweep Mark Sweep Mark Sweep
  • 49. Mark Mark Mark
  • 50. Lazy Sweep GC Full Bitmap Marking and Lazy Sweep GC
  • 51. https://gist.github.com/akitaonrails/10212233
  • 52. http://u.akita.ws/samsaffron_ruby20
  • 53. RUBY_GC_MALLOC_LIMIT=30000000 RUBY_HEAP_MIN_SLOTS=800000 bundle exec rails server
  • 54. RUBY_GC_MALLOC_LIMIT 8.000.000 30.000.000
  • 55. RUBY_GC_MALLOC_LIMIT 8.000.000 30.000.000 RUBY_HEAP_MIN_SLOTS 10.000 800.000
  • 56. env_gc_malloc_limit_in_mb 7.6mb 26.6mb
  • 57. env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65
  • 58. env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65 heaps_with_used_slots 1.089 1.477
  • 59. env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65 heaps_with_used_slots 1.089 1.477 total_heaps_allocated 1.958 1.965
  • 60. env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65 heaps_with_used_slots 1.089 1.477 total_heaps_allocated 1.958 1.965 total_heaps_allocated_in_mb 30.6mb 30.7mb
  • 61. env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65 heaps_with_used_slots 1.089 1.477 total_heaps_allocated 1.958 1.965 total_heaps_allocated_in_mb 30.6mb 30.7mb heaps_to_allocate_next_gc 869 0
  • 62. 71.9Mb
  • 63. 2.49Mb 71.9Mb
  • 64. GC Anterior
  • 65. Weak Generational Hypothesis “Most young objects die young"
  • 66. Young Generation (Eden) Old Generation (Tomb)
  • 67. Generational GC Copying Garbage Collector
  • 68. From-Heap To-Heap
  • 69. From-Heap To-Heap
  • 70. From-Heap To-Heap
  • 71. From-Heap To-Heap
  • 72. From-Heap To-Heap
  • 73. From-Heap To-Heap
  • 74. From-Heap To-Heap
  • 75. Mark-Compact GC Mark Copy Compact Heap Swap GC
  • 76. • “Stop-and-Copy”
  • 77. • “Stop-and-Copy” • Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre
  • 78. • “Stop-and-Copy” • Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre • Gerenciamento interno de ponteiros
  • 79. • “Stop-and-Copy” • Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre • Gerenciamento interno de ponteiros • Feito para corrigir fragmentação
  • 80. • “Stop-and-Copy” • Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre • Gerenciamento interno de ponteiros • Feito para corrigir fragmentação • Ruby tem slots de mesmo tamanho
  • 81. • “Stop-and-Copy” • Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre • Gerenciamento interno de ponteiros • Feito para corrigir fragmentação • Ruby tem slots de mesmo tamanho • Não suporta Copy-on-Write
  • 82. Ruby 2.1.x Shady vs Non-Shady
  • 83. Ruby Array
  • 84. Ruby Object Ruby Array
  • 85. Ruby Object Write Barrier (Non-Shady only) Ruby Array
  • 86. Shady Object Non-Shady Object (Sunny)
  • 87. Mark bitmap (mark_bits[]) Shady bitmap (rememberset_bits[])
  • 88. Mark bitmap (mark_bits[]) Shady bitmap (rememberset_bits[])
  • 89. Objetos "Old" 96.4%
  • 90. Objetos "Old" 96.4% Objetos "Young" 3.6%
  • 91. Objetos "Old" 96.4% Objetos "Young" 3.6% Objetos "Shady" 1.5%
  • 92. Mark Mark Mark
  • 93. Major GC Minor GC
  • 94. 2.49Mb 71.9Mb
  • 95. Restricted Generational GC (RGenGC) Full M&S for Shady, Generational for Non-Shady
  • 96. • Partial Markings, Lazy Sweeps = Menos Stop
  • 97. • Partial Markings, Lazy Sweeps = Menos Stop • Shady objects não vão para o Tomb
  • 98. • Partial Markings, Lazy Sweeps = Menos Stop • Shady objects não vão para o Tomb • Write Barriers (referência old para new - non-Shady only)
  • 99. • Partial Markings, Lazy Sweeps = Menos Stop • Shady objects não vão para o Tomb • Write Barriers (referência old para new - non-Shady only) • Compatível com extensões C (Shady)
  • 100. • Partial Markings, Lazy Sweeps = Menos Stop • Shady objects não vão para o Tomb • Write Barriers (referência old para new - non-Shady only) • Compatível com extensões C (Shady) • Objetos em Tomb só são remarcados em Full Mark
  • 101. < 1.3! (+ major GC)
  • 102. RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.3 bundle exec rails server força GC por diminuir o teto basicamente desabilita minor GC (de volta a Ruby 2.0.0)
  • 103. @retained = [] @rand = Random.new(999) ! MAX_STRING_SIZE = 100 ! def stress(allocate_count, retain_count, chunk_size) chunk = []   while retain_count > 0 || allocate_count > 0     if retain_count == 0 || (@rand.rand < 0.5 && allocate_count > 0) chunk << " " * (@rand.rand * MAX_STRING_SIZE).to_i allocate_count -= 1       if chunk.length > chunk_size chunk = [] end else @retained << " " * (@rand.rand * MAX_STRING_SIZE).to_i retain_count -= 1 end end end ! start = Time.now # simulate rails boot, 2M objects allocated 600K retained in memory stress(2_000_000, 600_000, 200_000) ! # simulate 100 requests that allocate 100K objects stress(10_000_000, 0, 100_000) http://u.akita.ws/ruby212ready
  • 104. Ruby 2.0 10 seg 119 mb Ruby 2.1.1 7 seg 230 mb ruby stress.rb http://u.akita.ws/ruby212ready
  • 105. Ruby 2.0 10 seg 119 mb Ruby 2.1.1 7 seg 230 mb 1.3 6.85 seg 180 mb RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.3 ruby stress.rb http://u.akita.ws/ruby212ready
  • 106. Ruby 2.0 10 seg 119 mb Ruby 2.1.1 7 seg 230 mb 1.3 6.85 seg 180 mb 0.9 6.75 seg 146 mb RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 ruby stress.rb http://u.akita.ws/ruby212ready
  • 107. Ruby 2.0 10 seg 119 mb Ruby 2.1.1 7 seg 230 mb 1.3 6.85 seg 180 mb 0.9 6.75 seg 146 mb 8 mb 9 seg 117 mb RUBY_GC_MALLOC_LIMIT_MAX=8000000 RUBY_GC_OLDMALLOC_LIMIT_MAX=8000000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 ruby stress.rb http://u.akita.ws/ruby212ready
  • 108. RUBY_GC_MALLOC_LIMIT_MAX 3210241024 8000000 RUBY_GC_OLDMALLOC_LIMIT_MAX 12810241024 8000000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 2.0 1.3 RUBY_GC_HEAP_INIT_SLOTS 10000 300000 RUBY_GC_HEAP_FREE_SLOTS 4096 300000 RUBY_GC_HEAP_GROWTH_FACTOR 1.8 1.25 RUBY_GC_HEAP_GROWTH_MAX_SLOTS (no limit) 150000 (obs: monitore, mensure, tuning, mensure de novo!) http://tmm1.net/ruby21-rgengc/
  • 109. • Objetos vão para Tomb se sobreviverem 1 GC
  • 110. • Objetos vão para Tomb se sobreviverem 1 GC • Objetos podem ir para Tomb cedo demais
  • 111. • Objetos vão para Tomb se sobreviverem 1 GC • Objetos podem ir para Tomb cedo demais • Eden - Survivor - Tenured - Permanent
  • 112. • Objetos vão para Tomb se sobreviverem 1 GC • Objetos podem ir para Tomb cedo demais • Eden - Survivor - Tenured - Permanent • RGENGC_THREEGEN mode (experimental 2.2)
  • 113. • Objetos vão para Tomb se sobreviverem 1 GC • Objetos podem ir para Tomb cedo demais • Eden - Survivor - Tenured - Permanent • RGENGC_THREEGEN mode (experimental 2.2) • Parallel Marking (ex. em Thread separada) • Tri-Color Marking (talvez)
  • 114. • Objetos vão para Tomb se sobreviverem 1 GC • Objetos podem ir para Tomb cedo demais • Eden - Survivor - Tenured - Permanent • RGENGC_THREEGEN mode (experimental 2.2) • Parallel Marking (ex. em Thread separada) • Tri-Color Marking (talvez) • Futuro: Incremental Major Phase (major GC menores)
  • 115. Java • Young Generation • -XX:+UseSerialGC (copying collector) • -XX:+UseParallelGC (copying collector multi-thread) • -XX:+UseParNewGC • Old Generation • -XX:+UseParallelOldGC • -XX:+UseConcMarkSweepGC
  • 116. Master Unicorn ou Passenger Rails App NGINX request 190ms
  • 117. Master Unicorn ou Passenger Rails App NGINX Rails App Rails App request 190ms 190ms 190ms
  • 118. Master Unicorn ou Passenger Rails App NGINX Rails App Rails App request 190ms 190ms 190ms 50ms de Full GC!
  • 119. Master Unicorn ou Passenger Rails App NGINX Rails App request 140ms 140ms Executa Full GC quando não receber request
  • 120. Master Unicorn ou Passenger Rails App NGINX Rails App Rails App request 140ms 140ms Full GC Executa Full GC quando não receber request
  • 121. OOBGC Out-of-Band Major GC
  • 122. http://tmm1.net/ruby21-oobgc/
  • 123. Pausas foram de 125ms para 50ms http://tmm1.net/ruby21-oobgc/
  • 124. CUIDADO!!
  • 125. CUIDADO!!
  • 126. http://u.akita.ws/rubymicroscope
  • 127. Obrigado! @akitaonrails slideshare.net/akitaonrails www.akitaonrails.com

×