garbage collector, finalizers & idisposable

15
FEVEREIRO DE 2015 GARBAGE COLLECTOR E CLR GRUPO DE ARQUITETOS

Upload: christiano-coutinho

Post on 19-Jul-2015

45 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Garbage Collector, Finalizers & IDisposable

FEVEREIRO DE 2015

GARBAGE COLLECTOR E CLRGRUPO DE ARQUITETOS

Page 2: Garbage Collector, Finalizers & IDisposable

ALTERNATIVA PARA O GERENCIAMENTO MANUAL, É RESPONSÁVEL

POR REALIZAR A COLETA DE TODAS AS INSTÂNCIAS OU TIPOS

PRIMITIVOS QUE NÃO POSSUEM MAIS REFERÊNCIAS, OU SEJA: SÃO

LIXO QUE PODE SER DESCARTADO. O CONCEITO EXISTE DESDE A

DÉCADA DE 50, NA LINGUAGEM LISP.

O QUE É GARBAGE COLLECTOR?

Page 3: Garbage Collector, Finalizers & IDisposable

COMO FUNCIONA O GARBAGE

COLLECTOR DO .NET?

“Contém trechos extraídos do livro “Programming .net

Components, Juval Lowy - ISBN: 0-596-10207-0”

Page 4: Garbage Collector, Finalizers & IDisposable

REALIZA COLETA AUTOMÁTICA DE

TODAS AS CLASSES QUE SÃO 100%

MANAGED CODE;

REALIZA A COLETA DE ACORDO COM

O SERVIÇO DE INFRA-ESTRUTURA

DA CLR, OU QUANDO O USUÁRIO

CHAMAR DE FORMA EXPLÍCITA

(GC.COLLECT)

PODE SER DISPARADO APENAS

PARA UMA GERAÇÃO OU PARA

TODAS.

GARBAGE COLLECTOR .NET

GARBAGE COLLECTOR

Page 5: Garbage Collector, Finalizers & IDisposable

GARBAGE COLLECTOR GENERATIONS

Page 6: Garbage Collector, Finalizers & IDisposable

A INTERFACE IDISPOSABLE É

UTILIZADA QUANDO UMA CLASSE

UTILIZAR RECURSOS NÃO

GERENCIADOS, IMPLEMENTANDO

NO MÉTODO DISPOSE A LIBERAÇÃO

DESSES MESMOS RECURSOS. NÃO

DEVE SER UTILIZADA PARA OUTROS

PROPÓSITOS.

ESSE TIPO DE OBJETO

(IDISPOSABLE) DEVE SER

DESCARTADO IMEDIATAMENTE

APÓS SUA UTILIZAÇÃO.

GARBAGE COLLECTOR .NET: IDISPOSABLE

IDISPOSABLE

Page 7: Garbage Collector, Finalizers & IDisposable

O PROBLEMA DE SE IMPLEMENTAR /

UTILIZAR A INTERFACE IDISPOSABLE

É O DE QUE NÃO EXISTE GARANTIA

ALGUMA QUE O DESENVOLVEDOR

IRÁ RESPEITAR E SEGUIR O SEU

CRITÉRIO DE UTILIZAÇÃO,

CHAMANDO O MÉTODO DISPOSE

ASSIM QUE O MESMO NÃO FOR

MAIS NECESSÁRIO

GARBAGE COLLECTOR .NET: IDISPOSABLE

IDISPOSABLE

Page 8: Garbage Collector, Finalizers & IDisposable

DESTRUTOR / FINALIZADOR

O METODO DESTRUTOR (FINALIZER) É

DISPARADO PELO GARBAGE COLECTOR

TODA VEZ QUE A COLETA DE UM OBJETO

COM DESTRUTOR É EFETUADA. O SERVIÇO

DE INFRA-ESTRUTURA DE CLR CONTROLA A

FILA DE FINALIZAÇÃO DE FORMA

TRANSPARENTE, SEM QUE O

DESENVOLVEDOR TENHA QUE CHAMAR O

DESTRUTOR DE FORMA EXPLÍCITA.

Page 9: Garbage Collector, Finalizers & IDisposable

NÃO SÃO MUTUAMENTE

EXCLUSIVOS, MAS DEVE-SE

SEMPRE CHAMAR O MÉTODO

GC.SUPRESSFINALIZER DENTRO DO

DISPOSE QUANDO A CLASSE

IMPLEMENTAR O DESTRUTOR.

QUANDO DEVO UTILIZAR O

DESTRUTOR E QUANDO DEVO

IMPLEMENTAR A INTERFACE

IDISPOSABLE E QUANDO DEVO

USAR OS 2?

IDISPOSABLE E DESTRUTORES

SÃO MUTUAMENTE EXCLUSIVOS?

Page 10: Garbage Collector, Finalizers & IDisposable

GARANTIR A CHAMADA DO

DISPOSE EM CLASSES

IDISPOSABLE ATRAVÉS DO USING

OU DO ANINHAMENTO DE

DISPOSE;

COMBINAR DESTRUTOR E

IDISPOSABLE PARA GARANTIR O

DESCARTE CORRETO DE

OBJETOS NÃO GERENCIADOS;

MANTER “VIVAS” AS REFERÊNCIAS

PARA OBJETOS IDISPOSABLE

PELO MENOR TEMPO POSSÍVEL.

BOAS PRÁTICAS DE DESENVOLVIMENTO

A SEREM SEGUIDAS, SEMPRE!SEMPRE:

Page 11: Garbage Collector, Finalizers & IDisposable

IMPLEMENTAR A INTERFACE

IDISPOSABLE EM CLASSES QUE

NÃO POSSUEM FIELDS OU

PROPERTIES NÃO GERENCIADAS

OU QUE NÃO IMPLEMENTEM A

INTERFACE IDISPOSABLE;

CRIAR METODOS DESTRUTORES

SEM NECESSIDADE, LEMBRANDO

SEMPRE DE COMO O GARBAGE

COLLECTOR FAZ A COLETA DE

LIXO;

DEIXAR DE CHAMAR O DISPOSE...

PRÁTICAS DE DESENVOLVIMENTO

A SEREM EVITADAS, SEMPRE!NUNCA:

Page 12: Garbage Collector, Finalizers & IDisposable

CASO CLÁSSICO DE PROBLEMAS ORIUNDOS DA NÃO

UTILIZAÇÃO CORRETA DE IDISPOSABLE E FINALIZERS

O PROVIDER .NET DO ORACLE UTILIZA

OBJETOS NÃO GERENCIADOS (DO CLIENT

ORACLE NATIVO). QUANDO NÃO SE FECHAM

AS CONEXÕES E/OU NÃO É CHAMADO O

DISPOSE DAS MESMAS, O GARBAGE

COLLECTOR É INCAPAZ DE SINALIZAR PARA

O ALGORITMO DO POOL QUE AS MESMAS

PODEM SER RECICLADAS E COM ISSO,

CRIA-SE UM VAZAMENTO DE CONEXÕES,

COM O POOL ESTOURANDO EM UM CURTO

ESPAÇO DE TEMPO.

Page 13: Garbage Collector, Finalizers & IDisposable

PROPOSTA DE SOLUÇÃO PARCIAL

EM RMSDATASERVER E DBSERVICES,

COMBINAR IDISPOSABLE E FINALIZER PARA

ATENDER A AMBOS OS CASOS: QUANDO O

DESENVOLVEDOR CHAMAR O DISPOSE

CORRETAMENTE, E QUANDO ELE NÃO

CHAMAR.

ENTRETANTO, QUAIS OS POSSÍVEIS CASOS

ONDE ESSA ESTRATÉGIA PODE VIR A

FALHAR? E QUAL SERIA O MOTIVO DA

FALHA?

Page 14: Garbage Collector, Finalizers & IDisposable

RESUMO

IDISPOSABLE + DESTRUTOR

• ENGLOBA TUDO O QUE FOI FALADO DOS

ITENS ISOLADOS, POSSIBILITANDO UM

ARRANJO QUE TENTA GARANTIR QUE UM

OBJETO SERÁ DESCARTADO CORRETAMENTE

MESMO QUE O DESENVOLVEDOR NÃO SIGA

AS MELHORES PRÁTICAS DE

DESENVOLVIMENTO;

IDISPOSABLE

• DEVE SEMPRE SER UTILIZADA EM CLASSES QUE POSSUIREM FIELDS

OU PROPERTIES NÃO GERENCIADAS OU QUE IMPLEMENTEM

IDISPOSABLE;

• DEVE TER SER CONSUMIDO CONSIDERANDO O MENOR ESCOPO DE

VIDA POSSÍVEL;

DESTRUTORES

• O MÉTODO DE FINALIZAÇÃO É CONTROLADO E CHAMADO

AUTOMÁTICAMENTE PELO GARBAGE COLLECTOR.

• SÓ DEVE SER UTILIZADO QUANDO FIZER SENTIDO, OU SEJA, QUANDO

ALGUMA AÇÃO PRECISAR SEMPRE DE SER EXECUTADA NO ATO DO

DESCARTE/COLETA DO OBJETO;

Page 15: Garbage Collector, Finalizers & IDisposable

Obrigado ;)

EQUIPE DE [email protected]