Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Portuguese

Pagetitle
FreeObj
FreeObj

Função: FreeObj

Elimina

da

memória

a

instância

do

objeto

informado

como

parâmetro.

Sintaxe

Bloco de código
collapsefalse
FreeObj( [ oObj ] )
--> Nil

Parâmetros

/Elementos

Nome

Tipo

Descrição

Obrigatório

Referência

oObj

Objeto

objeto

Indica o objeto AdvPL a ser eliminado da memória.

Nil (Nulo)

 

 

Observações

A função
  • A função FreeObj()
 elimina
  • elimina a instância
referenciada pelo objeto informado
  • referenciada pelo objeto informado como parâmetro.
 Esta
  • Esta função é utilizada para eliminar explicitamente a instância do objeto da memória do server, independentemente de haver outras referências aquela instância do objeto. Ao eliminarmos
uma instância
  • uma instância de objeto utilizando a função FreeObj(), as variáveis
que faziam referência
  • que faziam referência à instância eliminada passam a ter conteúdo nulo (
 NIL  
  • NIL ).
 Caso
  • Caso alguma referência ao objeto
elimiado
  • eliminado seja utilizada, a aplicação AdvPL será finalizada com a ocorrência de erro fatal
 
  • "Variable is not an object".

Utilização

A limpeza
  • A limpeza de uma instância de uma classe/objeto, na linguagem AdvPL,
 é realizada
  • é realizada normalmente pelo run-time do Kernel do Application Server, quando a variável sai do escopo de processamento e/ou quando a variável é anulada (
 oVariavel
  • oVariavel :=
NIL 
  • NIL ). Porém, caso a instância deste objeto esteja sendo referenciada por mais de uma variável,
 no
  • no momento que uma das variáveis
é anulada, é eliminada apenas
  • é anulada, é eliminada apenas uma referência,
mas a
  • mas a instância do
objeto continua
  • objeto continua ativa, pois ela ainda está sendo referenciada por outra variável.
 É recomendável
  • É recomendável o uso da função FreeObj()
 para
  • para objetos de componentes não-visuais, como classes AdvPL e/ou WebServices, uma vez que a determinada instância não será mais utilizada e/ou necessária no processamento, forçando a
limpeza da
  • limpeza da instância
do objeto
  • do objeto da memória e anulando todas as referências ativas do mesmo.
 Atenção - Importante 
  • A utilização da função FreeObj()
 requer
  • requer cuidado especial quando utilizada para eliminar da memória um objeto de uma classe visual (Objeto de Interface). Se a função for chamada para eliminar um objeto de interface ainda ativo, o Application Server pode apresentar comportamentos inesperados, como ocorrências de
 
  • "Exception Access Violation",
  
  • "Segment Fault"
 
  • , congelamento do serviço e/ou queda do servidor de aplicação.
 
  • Referência circular em classes AdvPL e consumo de
memória 
  • memória: Imagine uma classe AdvPL
chamada  
  • chamada "MsTeste", onde temos uma
propriedade chamada  
  • propriedade chamada "ObjParent", e durante a utilização do programa, uma instância de MsTeste recebe a si mesma
como conteúdo
  • como conteúdo da propriedade objParent, ou ainda, duas instâncias distintas da classe MsTeste, onde uma instância contém a outra alimentada na propriedade oObjParent. Por exemplo :
 


Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
// Exemplo 1 :
 Referencia
 Referencia a si mesmo , a->aLocal oJustMe := MsTeste():New()oJustMe:oObjParent := oJustMe

// Exemplo 2 :
 Referencia
 Referencia Circular, a->b e b->a Local oObj1 := MsTeste():New()Local oObj2 := MsTeste():New()oObj1:oObjParent := oObj2oObj2:oObjParent := oObj1


Em ambos os casos mencionados, o objeto foi referenciado de forma "circular", isto é, uma referência do objeto aponta para ele mesmo, ou aponta para outra instância que aponta para a instância original. Neste cenário, o vazamento de memória é caracterizado pelo consumo crescente de memória na aplicação, após sucessivas e consecutivas criações de instâncias do objeto, que podem culminar com a queda do serviço

do ERP

do ERP por esgotamento de memória da máquina e/ou memória alocável pelo serviço, o que for atingido primeiro.

  A memória

A memória excedente alocada nestas condições sempre é completamente

liberada 

liberada ao sistema operacional quando a thread/processo é terminada e/ou o Smart Client é fechado.

Se um programa utiliza uma construção desta natureza, ele deve estar preparado para lidar com este cenário, onde o uso de uma recursão no objeto sem o tratamento adequado colocaria o programa AdvPL em LOOP

infinito e

infinito e/ou

até estourar o

até estourar o stack do AdvPL, e deve estar dotado de um procedimento para eliminar uma instância e suas

dependencias

dependências da memória quando o objeto não for mais utilizado. Isto pode ser feito de duas formas :

 

Atribuindo NIL primeiro nas propriedades do objeto, e então atribuindo

NIL no

NIL no próprio objeto


 

Utilizando a função FreeObj()

 quando

quando o objeto não for mais utilizado e/ou necessário no

prrocessamento

processamento em questão.

A presença

A presença de uma referência circular em uma classe ou encadeamento de classes AdvPL, sem o destrutor adequado, está sujeito a

um   

um "RunTime Leak" (ou vazamento de memória em tempo de execução), onde cada criação de uma nova instância de uma determinada classe não é automaticamente limpa da memória no caso de saída de escopo ou até mesmo atribuindo

NIL apenas

NIL apenas na variável que contém o objeto, pois o fato dele ainda ter uma referência em uso o impede de ser

elimiado

eliminado da memória, mesmo que a referência esteja em uso por ele mesmo.

A implementação

A implementação deste nível de verificação na execução de código AdvPL seria muito dispendiosa e seria prejudicial à performance da aplicação. Veja o exemplo abaixo :

 

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
User Function ExemploReferenciaCircular()
  Local oJustMe := MsTeste():New()oJustMe:oObjParent := oJustMe   // Cria a referencia circular
  // processamento ..etc... /
  / processou, vou destruir o objeto.
  oJustMe:oObjParent := 
NIL 
NIL
  // primeiro limpa a propriedade
 
propriedadeoJustMe
 oJustMe := 
NIL 
NIL
  
// agora sim limpa o objeto
/* ou
 ou , limpa a instancia usando freeobj()
 */

  FreeObj(oJustMe)

return

Exemplo

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
Exemplos
User Function 
ProcMyObj
Exemplo()
  Local oObj := MyClass():New()oObj:DoSomething("Hello")
  oObj:DoNothing("Goodbye")
  FreeObj(oObj)
Return

Abrangência

Microsiga Protheus 8.11 , Protheus 10 , TOTVS Application Server 10

, ByYou Application Server