Árvore de páginas

A função ShowInfMem tem como objetivo auxiliar a verificação de aumento, acumulo, ou simplesmente para um gerenciamento de memória para o programador checar em determinada "instância" do seu programa como esta os contadores de memória através do Smartheap.

Essa função irá exibir todas as informações de alocação em todas as threads, logo tem como objetivo apenas a caráter de estudo, e não deve ser usado em um ambiente de produção, pois as informações serão distorcidas, já que as informações são compartilhadas em todas as threads. Então, para que as informações sejam coerentes, deve-se realizar o uso apenas de uma thread entre as comparações dos valores retornados pela função evitando processos concorrentes.

As informações exibidas em console.log e que também são carregadas no array dinâmico são dos principais pools de memória que o Appserver aloca durante a execução de um programa. A primeira coluna se trata dos kbytes armazenados pelo server, e mostram quanto foi o buffer armazenado no pool daquela alocação. Por se tratar de um pool, a memória é gerenciada internamente para, dependendo do volume de alocações, uma pequena porcentagem daquela memória fica armazenada no pool. Considerando que se trata de um pool de memória, isso é perfeitamente normal e não deve ser levado em consideração para checagem de aumento de memória. Em um cenário em que a mesma aplicação, rodando diversas vezes, o pool tende a estabilizar e não deve crescer se são as mesmas variáveis e se o caminho percorrido pela execução for a mesma. Qualquer situação diferente dessa deve ser analisada.

A segunda coluna trata-se do contador de objetos na memória naquele pool, é a mais precisa para checar o quanto de memória ficou alocado na aplicação. O contador tende a se estabilizar quando a mesma rotina na mesma thread é chamada diversas vezes, ou então deve mostrar o mesmo valor inicial e final quando a thread é executada diversas vezes. Importante: No momento de finalização do server, com a chave DebugThreadUsedMemory ligada, na lista exibida em "SMARTHEAP POOL STATUS AFTER FINISHED PROCESSES", essa informação deve ser sempre zero nos pools de memória, e exceto a informação de pool default, deve-se reportar ao setor de Tecnologia TOTVS para analise da aplicação que gera essa ocorrência, pois se trata de um leak de memória interna do servidor.

Como Usar

Uma das formas de diagnostico de utilização da memória é realizar a chamada varias vezes de uma determinada rotina, onde esta deve estabilizar o contador de memória após algumas chamadas (o contador de memória mostra a memória que esta em pool), e caso isso não ocorra, deve ser considerado que existe um provável problema de leak de execução no programa.

Outra forma de diagnostico é realizar a chamada entre a criação de uma thread e contabilizar o estado da memória antes e depois da execução da thread. Ao finalizar uma thread, se o valor continuar a aumentar e não voltar ao se valor inicial (antes da criação da thread), pode ser observado assim um provável problema de leak.

Sintaxe

 

retorno := ShowInfMem(<param1>,<param2>)

Parâmetros

NomeTipoDescriçãoObrigatórioReferênciaObservações
<param1>Char

Parâmetro para indicar o ponto onde foi "acionado" a função para o programador

NN
<param2>Array bidimensionalArray de duas dimensões, onde cada elemento contem outro array com duas posições: Kilobytes, Count.NSSe observado no conout da função no log, é a mesma informação que é listada em cada linha de pool: Ex: pooltString ...  143.91 kB. Count    731

Retorno

NomeTipoDescriçãoObservações
retornoBooleano

Indica se a função executou com sucesso

Em caso de erros, verifique o tamanho do array passado por parametro, ou a versão da release do Appserver.

Observações

Essa função só esta disponível em builds superiores ao build 7.00.131227A do dia 11/11/2015. Só funciona em builds release.

Exemplos

Exemplo 

#include "protheus.ch"

User Function tst_showinfomem()

local infos
local i
local texto

infos := Array(50, 2)

ShowInfMem("inicio",infos)

conout("Informacao relevante: " + cValtoChar(infos[1][1]) + " kb , Count " + cValtoChar(infos[1][2]))
conout("Informacao relevante: " + cValtoChar(infos[2][1]) + " kb , Count " + cValtoChar(infos[2][2]))
conout("Informacao relevante: " + cValtoChar(infos[3][1]) + " kb , Count " + cValtoChar(infos[3][2]))

conout("FIZ UM CONOUT SIMPLES.. QUAL SERIA O CONSUMO DO SMARTHEAP?")

ShowInfMem("Antes leitura do Cursor: Programa 1", infos)
conout("Informacao relevante: " + cValtoChar(infos[3][1]) + " kb , Count " + cValtoChar(infos[3][2]) )

For i := 1 to 10
texto := "Teste de repeticoes: " + cValtoChar(i)
teste_advpl_showmeminf02()
ShowInfMem(texto,infos)

Next

Return


FUNCTION teste_advpl_showmeminf02()

Local lOk 

tclink()
conout("Conectado. Testando com tcsqlexec") 


if tcsqlexec("select COD_CLIENTE from CLIENTES") == 0 

conout('Sql executado!')

end if 

return
  • Sem rótulos