garbage collector, finalizers & idisposable
TRANSCRIPT
FEVEREIRO DE 2015
GARBAGE COLLECTOR E CLRGRUPO DE ARQUITETOS
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?
COMO FUNCIONA O GARBAGE
COLLECTOR DO .NET?
“Contém trechos extraídos do livro “Programming .net
Components, Juval Lowy - ISBN: 0-596-10207-0”
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
GARBAGE COLLECTOR GENERATIONS
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
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
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.
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?
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:
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:
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.
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?
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;
Obrigado ;)
EQUIPE DE [email protected]