SlideShare uma empresa Scribd logo
1 de 27
Gerenciamento de Memória
Carlos dos Santos
CDS Software
Microsoft MVP
Microsoft Regional Director
carlos@cds-software.com.br
www.cds-software.com.br
@cdssoftware
• Mais de 25 anos de experiência no desenvolvimento de software
• Responsável por Pesquisa e Desenvolvimento na CDS Informática
• Microsoft MVP desde 2008
• Microsoft Regional Director
• Um dos criadores do projeto open source CodeCracker: www.github.com/code-cracker
• Mantenedor do projeto open source BoletoNet: www.github.com/boletonet
• Blog: www.carloscds.net
• GitHub: www.github.com/carloscds
www.gotaskfly.com
www.gotaskfly.com
Source
Code
Compilação
No momento da
instalação ou na
primeira vez que
o método é
chamado
Language
Compiler
Assembly
(exe/dll)
Code (IL)
Metadata
Execução
JIT
Compiler
Native
Code
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
Stack Heap
x = 0
int x = 0;
www.gotaskfly.com
Stack Heap
cli: Cliente Codigo:1 | Nome: “Carlos”
Cliente cli = new Cliente();
cli.Codigo = 1;
cli.Nome = “Carlos”;
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
www.gotaskfly.com
• Cada processo tem seu próprio espaço de endereço virtual separado. Todos os processos no mesmo computador
compartilham a mesma memória física e arquivo de paginação, se houver algum.
• Por padrão, em computadores de 32 bits, cada processo tem um espaço de endereço virtual no modo de usuário
de 2 GB.
• Como desenvolvedor de aplicativos, você trabalha apenas com o espaço de endereço virtual e nunca manipula a
memória física diretamente. O coletor de lixo aloca e libera memória virtual para você no heap gerenciado.
• Condições para coleta de lixo (GC):
• O sistema tem pouca memória física. Isso é detectado pela notificação de falta de memória do sistema operacional.
• A memória usada por objetos alocados no heap gerenciado ultrapassa o limite aceitável. Esse limite é ajustado
continuamente enquanto o processo é executado.
• O método GC.Collect é chamado. Em quase todos os casos, você não precisa chamar esse método porque o coletor de
lixo funciona continuamente. Esse método é usado principalmente para situações exclusivas e testes.
• Chamar o GC.Collect não indica que a memória será coletada naquele momento
www.gotaskfly.com
• O heap está organizado em gerações de modo que possa manipular objetos de vida útil longa e curta. A coleta
de lixo ocorre principalmente com a recuperação de objetos de vida útil curta, que geralmente ocupam apenas
uma pequena parte do heap. Há três gerações de objetos no heap:
• Geração 0. Essa é a geração mais jovem e contém objetos de vida útil curta. Um exemplo de um objeto de
vida útil curta é uma variável temporária. A coleta de lixo ocorre com mais frequência nessa geração.
• Geração 1. Essa geração contém objetos de vida útil curta e serve como um buffer entre objetos de vida útil
curta e longa. Normalmente passou pelo GC e por ter espaço no heap permaneceu.
• Geração 2. Essa geração contém objetos de vida útil longa. Um exemplo de um objeto de vida útil longa é
um objeto em um aplicativo para servidores que contém dados estáticos que estão vivos durante o
processo.
• Dicas:
• Use sempre Dispose(), trabalhe com using {}
• Não fique chamando o GC.Collect(), ele sabe quando precisa rodar!!!
• Cuidado com objetos não gerenciados: PInvoke
www.gotaskfly.com
• Vamos imaginar que temos 5 objetos criados – Gen 0:
• Agora o GC inicia e libera os objetos 1, 3 e 5 e move 2 e 4 para o início, enquanto criamos 6, 7, 8, 9 e 10. Ficamos
então com 2 e 4 na Gen 1 e o restante em Gen 0:
• Novamente o GC inicia, coletando alguns objetos, enquanto criamos novos:
• Imaginamos que a Gen 1 está cheia:
• Então os objetos “sobreviventes” da Gen 1 vão para Gen 2, e temos memória livre:
1 2 3 4 5
2 4 6 7 8 9 10
2 4 6 7 10 11 12 13 14 15
2 6 10 13 15 16 17 18 19 20
2 6 10 13 17 18 20
Gen 0 Gen 1 Gen 2
www.gotaskfly.com
• Boxing é o processo de conversão de ValueType para o tipo object, e Unboxing é o inverso.
• Veja no exemplo abaixo, a variável valor (inteiro) é boxed para obj (object):
• O objeto pode ser então unboxed para int:
Stack Heap
valor = 0
obj = valor; int: 0
int valor = 0;
object obj = valor;
obj = 100;
valor = (int)obj;
www.gotaskfly.com
• Ao chamar uma classe que implementa a interface IDisposable, teremos o método Dispose(), que é chamado
pelo GC.
• Utilizamos o Dispose() para liberar recursos não mais utilizados, principalmente não gerenciados.
• Utilizar o método using {} automaticamente chama o Dispose()
• GC.SuppressFinalize() indica para o GC que o objeto já foi “limpo” e não precisa ser coletado.
www.gotaskfly.com
• Variáveis estáticas não são coletadas pelo GC.
• Ela existem durante toda a execução da aplicação.
• Potencialmente perigosas em aplicações web, pois podem compartilhar dados entre as sessões.
www.gotaskfly.com
• Evite concatenação de strings, para isto use o StringBuilder.
• StringBuilder é muito mais rápido e eficiente.
www.gotaskfly.com
• System.Span<T> é um novo tipo de valor no .NET.
• Permite a representação de regiões contíguas de memória!
• Não importa se a memória está associada a um objeto gerenciado, foi fornecida por código nativo por interop
ou está na pilha.
• E ele faz isso oferecendo acesso seguro com características de desempenho semelhantes às das matrizes.
www.gotaskfly.com
www.gotaskfly.com
• Degradação de performance ao longo do tempo – memory leak
• Problemas com escalabilidade, mais usuários, mais problemas (obs: você faz teste de carga?)
• Memoria não melhora mesmo reiniciando a aplicação – objetos temporários
• Como verificar este tipo de problema:
• Visual Studio Profiler
• Perfmon do Windows
www.gotaskfly.com
Vamos a prática!
www.gotaskfly.com
Obrigado!
Carlos dos Santos
CDS Software
carlos@cds-software.com.br
www.carloscds.net
@cdssoftware

Mais conteúdo relacionado

Semelhante a Gerenciamento memória .NET

Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...Sandro Suffert
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeStefan Teixeira
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ..."Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...Cesar Augusto Nogueira
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting dockerRafael Gomes
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Renato Groff
 
Boas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesBoas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesGraziella Bonizi
 
Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)Helder da Rocha
 
utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythontdc-globalcode
 
Desenvolvendos Apps para iPad - TDC 2010
Desenvolvendos Apps para iPad - TDC 2010Desenvolvendos Apps para iPad - TDC 2010
Desenvolvendos Apps para iPad - TDC 2010Felipe Cypriano
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo realEvandro Silvestre
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Renato Groff
 
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...Renato Groff
 

Semelhante a Gerenciamento memória .NET (20)

Mean Stack
Mean StackMean Stack
Mean Stack
 
Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ..."Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
"Se tornando um Desenvolvedor Java NINJA" - Semana Integrada da PUC Campinas ...
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting docker
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
 
Boas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no KubernetesBoas práticas na configuração de jobs no Kubernetes
Boas práticas na configuração de jobs no Kubernetes
 
Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)Gerência de Memória em Java - Parte III (2005)
Gerência de Memória em Java - Parte III (2005)
 
Puppet webcast 4linux
Puppet webcast 4linuxPuppet webcast 4linux
Puppet webcast 4linux
 
utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em python
 
Desenvolvendos Apps para iPad - TDC 2010
Desenvolvendos Apps para iPad - TDC 2010Desenvolvendos Apps para iPad - TDC 2010
Desenvolvendos Apps para iPad - TDC 2010
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
Docker + Kubernetes: Orquestrando containers e escalando rapidamente suas apl...
 
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...
Docker + Kubernetes: Turbinando seus projetos Web - Open Source Saturday - Ag...
 

Mais de CDS

Web App Container
Web App ContainerWeb App Container
Web App ContainerCDS
 
Azure DevOps Pipeline
Azure DevOps PipelineAzure DevOps Pipeline
Azure DevOps PipelineCDS
 
Azure Functions Spanish
Azure Functions SpanishAzure Functions Spanish
Azure Functions SpanishCDS
 
Visual Studio Code
Visual Studio CodeVisual Studio Code
Visual Studio CodeCDS
 
GitHub Boas Práticas
GitHub Boas PráticasGitHub Boas Práticas
GitHub Boas PráticasCDS
 
MVPConf - Azure Functions
MVPConf - Azure FunctionsMVPConf - Azure Functions
MVPConf - Azure FunctionsCDS
 
Microsoft Operations Management Suite - OMS
Microsoft Operations Management Suite - OMSMicrosoft Operations Management Suite - OMS
Microsoft Operations Management Suite - OMSCDS
 
Voce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraVoce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraCDS
 
Criando infraestrutura de Azure com Fluebn API e C#
Criando infraestrutura de Azure com Fluebn API e C#Criando infraestrutura de Azure com Fluebn API e C#
Criando infraestrutura de Azure com Fluebn API e C#CDS
 
C# 7
C# 7C# 7
C# 7CDS
 
SonarQube
SonarQubeSonarQube
SonarQubeCDS
 
Microsoft opensource
Microsoft opensourceMicrosoft opensource
Microsoft opensourceCDS
 
.Net Core - Visão Geral
.Net Core - Visão Geral.Net Core - Visão Geral
.Net Core - Visão GeralCDS
 
Raspberry PI
Raspberry PIRaspberry PI
Raspberry PICDS
 
Sonarqube
SonarqubeSonarqube
SonarqubeCDS
 
Microsoft opensource
Microsoft opensourceMicrosoft opensource
Microsoft opensourceCDS
 
Application Insights
Application InsightsApplication Insights
Application InsightsCDS
 
Palestra Roslyn - TechEd 2015
Palestra Roslyn - TechEd 2015Palestra Roslyn - TechEd 2015
Palestra Roslyn - TechEd 2015CDS
 
Microsoft Azure Overview
Microsoft Azure OverviewMicrosoft Azure Overview
Microsoft Azure OverviewCDS
 
C# 6
C# 6C# 6
C# 6CDS
 

Mais de CDS (20)

Web App Container
Web App ContainerWeb App Container
Web App Container
 
Azure DevOps Pipeline
Azure DevOps PipelineAzure DevOps Pipeline
Azure DevOps Pipeline
 
Azure Functions Spanish
Azure Functions SpanishAzure Functions Spanish
Azure Functions Spanish
 
Visual Studio Code
Visual Studio CodeVisual Studio Code
Visual Studio Code
 
GitHub Boas Práticas
GitHub Boas PráticasGitHub Boas Práticas
GitHub Boas Práticas
 
MVPConf - Azure Functions
MVPConf - Azure FunctionsMVPConf - Azure Functions
MVPConf - Azure Functions
 
Microsoft Operations Management Suite - OMS
Microsoft Operations Management Suite - OMSMicrosoft Operations Management Suite - OMS
Microsoft Operations Management Suite - OMS
 
Voce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraVoce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infra
 
Criando infraestrutura de Azure com Fluebn API e C#
Criando infraestrutura de Azure com Fluebn API e C#Criando infraestrutura de Azure com Fluebn API e C#
Criando infraestrutura de Azure com Fluebn API e C#
 
C# 7
C# 7C# 7
C# 7
 
SonarQube
SonarQubeSonarQube
SonarQube
 
Microsoft opensource
Microsoft opensourceMicrosoft opensource
Microsoft opensource
 
.Net Core - Visão Geral
.Net Core - Visão Geral.Net Core - Visão Geral
.Net Core - Visão Geral
 
Raspberry PI
Raspberry PIRaspberry PI
Raspberry PI
 
Sonarqube
SonarqubeSonarqube
Sonarqube
 
Microsoft opensource
Microsoft opensourceMicrosoft opensource
Microsoft opensource
 
Application Insights
Application InsightsApplication Insights
Application Insights
 
Palestra Roslyn - TechEd 2015
Palestra Roslyn - TechEd 2015Palestra Roslyn - TechEd 2015
Palestra Roslyn - TechEd 2015
 
Microsoft Azure Overview
Microsoft Azure OverviewMicrosoft Azure Overview
Microsoft Azure Overview
 
C# 6
C# 6C# 6
C# 6
 

Gerenciamento memória .NET

  • 1. Gerenciamento de Memória Carlos dos Santos CDS Software Microsoft MVP Microsoft Regional Director carlos@cds-software.com.br www.cds-software.com.br @cdssoftware
  • 2. • Mais de 25 anos de experiência no desenvolvimento de software • Responsável por Pesquisa e Desenvolvimento na CDS Informática • Microsoft MVP desde 2008 • Microsoft Regional Director • Um dos criadores do projeto open source CodeCracker: www.github.com/code-cracker • Mantenedor do projeto open source BoletoNet: www.github.com/boletonet • Blog: www.carloscds.net • GitHub: www.github.com/carloscds
  • 4. www.gotaskfly.com Source Code Compilação No momento da instalação ou na primeira vez que o método é chamado Language Compiler Assembly (exe/dll) Code (IL) Metadata Execução JIT Compiler Native Code
  • 12. www.gotaskfly.com Stack Heap cli: Cliente Codigo:1 | Nome: “Carlos” Cliente cli = new Cliente(); cli.Codigo = 1; cli.Nome = “Carlos”;
  • 16. www.gotaskfly.com • Cada processo tem seu próprio espaço de endereço virtual separado. Todos os processos no mesmo computador compartilham a mesma memória física e arquivo de paginação, se houver algum. • Por padrão, em computadores de 32 bits, cada processo tem um espaço de endereço virtual no modo de usuário de 2 GB. • Como desenvolvedor de aplicativos, você trabalha apenas com o espaço de endereço virtual e nunca manipula a memória física diretamente. O coletor de lixo aloca e libera memória virtual para você no heap gerenciado. • Condições para coleta de lixo (GC): • O sistema tem pouca memória física. Isso é detectado pela notificação de falta de memória do sistema operacional. • A memória usada por objetos alocados no heap gerenciado ultrapassa o limite aceitável. Esse limite é ajustado continuamente enquanto o processo é executado. • O método GC.Collect é chamado. Em quase todos os casos, você não precisa chamar esse método porque o coletor de lixo funciona continuamente. Esse método é usado principalmente para situações exclusivas e testes. • Chamar o GC.Collect não indica que a memória será coletada naquele momento
  • 17. www.gotaskfly.com • O heap está organizado em gerações de modo que possa manipular objetos de vida útil longa e curta. A coleta de lixo ocorre principalmente com a recuperação de objetos de vida útil curta, que geralmente ocupam apenas uma pequena parte do heap. Há três gerações de objetos no heap: • Geração 0. Essa é a geração mais jovem e contém objetos de vida útil curta. Um exemplo de um objeto de vida útil curta é uma variável temporária. A coleta de lixo ocorre com mais frequência nessa geração. • Geração 1. Essa geração contém objetos de vida útil curta e serve como um buffer entre objetos de vida útil curta e longa. Normalmente passou pelo GC e por ter espaço no heap permaneceu. • Geração 2. Essa geração contém objetos de vida útil longa. Um exemplo de um objeto de vida útil longa é um objeto em um aplicativo para servidores que contém dados estáticos que estão vivos durante o processo. • Dicas: • Use sempre Dispose(), trabalhe com using {} • Não fique chamando o GC.Collect(), ele sabe quando precisa rodar!!! • Cuidado com objetos não gerenciados: PInvoke
  • 18. www.gotaskfly.com • Vamos imaginar que temos 5 objetos criados – Gen 0: • Agora o GC inicia e libera os objetos 1, 3 e 5 e move 2 e 4 para o início, enquanto criamos 6, 7, 8, 9 e 10. Ficamos então com 2 e 4 na Gen 1 e o restante em Gen 0: • Novamente o GC inicia, coletando alguns objetos, enquanto criamos novos: • Imaginamos que a Gen 1 está cheia: • Então os objetos “sobreviventes” da Gen 1 vão para Gen 2, e temos memória livre: 1 2 3 4 5 2 4 6 7 8 9 10 2 4 6 7 10 11 12 13 14 15 2 6 10 13 15 16 17 18 19 20 2 6 10 13 17 18 20 Gen 0 Gen 1 Gen 2
  • 19. www.gotaskfly.com • Boxing é o processo de conversão de ValueType para o tipo object, e Unboxing é o inverso. • Veja no exemplo abaixo, a variável valor (inteiro) é boxed para obj (object): • O objeto pode ser então unboxed para int: Stack Heap valor = 0 obj = valor; int: 0 int valor = 0; object obj = valor; obj = 100; valor = (int)obj;
  • 20. www.gotaskfly.com • Ao chamar uma classe que implementa a interface IDisposable, teremos o método Dispose(), que é chamado pelo GC. • Utilizamos o Dispose() para liberar recursos não mais utilizados, principalmente não gerenciados. • Utilizar o método using {} automaticamente chama o Dispose() • GC.SuppressFinalize() indica para o GC que o objeto já foi “limpo” e não precisa ser coletado.
  • 21. www.gotaskfly.com • Variáveis estáticas não são coletadas pelo GC. • Ela existem durante toda a execução da aplicação. • Potencialmente perigosas em aplicações web, pois podem compartilhar dados entre as sessões.
  • 22. www.gotaskfly.com • Evite concatenação de strings, para isto use o StringBuilder. • StringBuilder é muito mais rápido e eficiente.
  • 23. www.gotaskfly.com • System.Span<T> é um novo tipo de valor no .NET. • Permite a representação de regiões contíguas de memória! • Não importa se a memória está associada a um objeto gerenciado, foi fornecida por código nativo por interop ou está na pilha. • E ele faz isso oferecendo acesso seguro com características de desempenho semelhantes às das matrizes.
  • 25. www.gotaskfly.com • Degradação de performance ao longo do tempo – memory leak • Problemas com escalabilidade, mais usuários, mais problemas (obs: você faz teste de carga?) • Memoria não melhora mesmo reiniciando a aplicação – objetos temporários • Como verificar este tipo de problema: • Visual Studio Profiler • Perfmon do Windows
  • 27. www.gotaskfly.com Obrigado! Carlos dos Santos CDS Software carlos@cds-software.com.br www.carloscds.net @cdssoftware