Página 2 de 4

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 20:48
por JoséQuintas
No último teste alterei 1002 pra 1001.

De repente, máxima memória usada poderia ser o máximo que atingiu, e não o uso atual.

O resultado foi parecido.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 20:56
por Itamar M. Lins Jr.
Olá!
No Linux dá tudo zero.
Depois eu testo no ruindows.
Mudei aqui para vários ou dá 9999 ou 0
Não entendi nada.

Saudações,
Itamar M. Lins Jr.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 20:57
por JoséQuintas
teste 3 vezes seguidas

Código: Selecionar todos


#define MEM_TEST 1001

PROCEDURE Main

   LOCAL F, aLista := {}, nCont

   SetMode(40,100)
   CLS
   FOR nCont = 1 TO 3
      ? "Antes do array: " + Ltrim( Str( Memory(MEM_TEST) ) )

      FOR F := 1 TO 1000000
         AAdd( aLista, { F, Hb_RandomInt(99) , hb_RandomInt(99), Date() - F, F % 2 == 0, hb_RandomInt(99), F * 10   } )
      NEXT
      ? "Depois do array: " + Ltrim( Str( Memory(MEM_TEST) ) )
      aLista := {}
      ( aLista )
      ? "Zerando: " + Ltrim( Str( Memory(MEM_TEST) ) )
      hb_GcAll()
      ? "hb_gcAll() : " + Ltrim( Str( Memory(MEM_TEST) ) )
   NEXT

   Inkey(0)

   RETURN
memoria.png
o resultado não é sempre o mesmo.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:02
por JoséQuintas
E por último, em CONSOLE, sem GTWVG.
Antes do array: 262144
Depois do array: 261423104
Zerando: 231800832
hb_gcAll() : 230817792

Antes do array: 230817792
Depois do array: 261423104
Zerando: 589824
hb_gcAll() : 589824

Antes do array: 589824
Depois do array: 261423104
Zerando: 230817792
hb_gcAll() : 230817792

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:08
por JoséQuintas
Mais um teste, atribuindo NIL melhorou muuuuuuuuito, mas continua um resto:

Código: Selecionar todos


#define MEM_TEST 1001

PROCEDURE Main

   LOCAL F, aLista := {}, nCont

   SetMode(40,100)
   CLS
   FOR nCont = 1 TO 3
      ? "Antes do array: " + Ltrim( Str( Memory(MEM_TEST) ) )

      FOR F := 1 TO 1000000
         AAdd( aLista, { F, Hb_RandomInt(99) , hb_RandomInt(99), Date() - F, F % 2 == 0, hb_RandomInt(99), F * 10   } )
      NEXT
      ? "Depois do array: " + Ltrim( Str( Memory(MEM_TEST) ) )
      aLista := Nil
      aLista := {}
      Inkey(1)
      ( aLista )
      ? "Zerando: " + Ltrim( Str( Memory(MEM_TEST) ) )
      hb_GcAll()
      Inkey(1)
      ? "hb_gcAll() : " + Ltrim( Str( Memory(MEM_TEST) ) )
   NEXT

   Inkey(0)

   RETURN
test.png

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:23
por JoséQuintas
Isso acima já foi ruim..... mas pode piorar....

Código: Selecionar todos


#include "hbmemory.ch"
#define MEM_TEST HB_MEM_USED
#pragma -w0

PROCEDURE Main

   LOCAL nCont

   SetMode(40,100)
   CLS
   FOR nCont = 1 TO 3
      SubTest()
   NEXT

   Inkey(0)

   RETURN

FUNCTION SubTest()

   LOCAL aList, F

   aList := {}
   ? "Before array: " + Ltrim( Str( Memory(MEM_TEST) ) )
   FOR F := 1 TO 1000000
      AAdd( aList, { F, Hb_RandomInt(99) , hb_RandomInt(99), Date() - F, F % 2 == 0, hb_RandomInt(99), F * 10   } )
   NEXT
   ? "After array: " + Ltrim( Str( Memory(MEM_TEST) ) )
   aList := {}
   ? "Empty List: " + Ltrim( Str( Memory(MEM_TEST) ) )
   aList := Nil
   ? "Nil: " + Ltrim( Str( MEM_TEST ) )

   RETURN Nil
test.png
Agora é que fud. tudo.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:26
por JoséQuintas
Porque se contentar só com isso, vamos fud. mais ainda.
memory.png
Que tal um resultado diferente a cada execução ?

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:28
por Itamar M. Lins Jr.
Olá!
Essa memória ai deve ser do OS. O windows que cuida disso.
Quando tem um release, é no nosso sistema, depois a hora quando achar que deve o windows executa, um buffer sei lá...
Seria bom ver o painel do windows de memória alocada.

Saudações,
Itamar M. Lins Jr.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:31
por JoséQuintas
Pior ainda....
Como pode após zerar, reduzir o uso de memória, ele aparecer maior ?
Notaram isso?
Não entendi mais nada.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:33
por JoséQuintas
Itamar M. Lins Jr. escreveu:Essa memória ai deve ser do OS. O windows que cuida disso.
Quando tem um release, é no nosso sistema, depois a hora quando achar que deve o windows executa, um buffer sei lá...
Seria bom ver o painel do windows de memória alocada.
Não fez nenhum sentido, porque ao atribuir NIL reduziu, mas no próximo teste, voltou com memória alocada, a que tinha sumido.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:34
por JoséQuintas
É como se a variável LOCAL tivesse virado STATIC, ou algo assim.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:34
por Itamar M. Lins Jr.
Olá!
Tem uns testes na pasta /tests

Código: Selecionar todos

itamar@itamar-desktop:~/dev/hb32/tests$ cat mem.prg 
// Testing memory release

PROCEDURE Main()

   LOCAL a, b

   a := "Hello"
   b := 2

   HB_SYMBOL_UNUSED( a )
   HB_SYMBOL_UNUSED( b )

   RETURN
Tem memory.prg também.

Saudações,
Itamar M. Lins Jr.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:47
por JoséQuintas
Cometi um erro no fonte, mas acabei postando no harbour-users com o erro.

Após NIL, ao invés de Memory(MEM_TEST) coloquei MEM_TEST apenas, por isso o 1001.

Pelo menos tanto faz Nil ou não, mas a diferença continua.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 21:52
por JoséQuintas
fonte corrigido

Código: Selecionar todos


#include "hbmemory.ch"
#define MEM_TEST HB_MEM_USED
#pragma -w0

PROCEDURE Main

   LOCAL nCont

   SetMode(40,100)
   CLS
   ? "Main: " + Ltrim( Str( Memory(MEM_TEST) ) )
   FOR nCont = 1 TO 3
      ?
      ? "Main before subtest: " + Ltrim( Str( Memory(MEM_TEST) ) )
      SubTest()
      ? "Main after subtest: " + Ltrim( Str( Memory(MEM_TEST) ) )
   NEXT
   ?
   ? "Main after for/next: " + Ltrim( Str( Memory(MEM_TEST) ) )

   Inkey(0)

   RETURN

FUNCTION SubTest()

   LOCAL aList, F

   aList := {}
   ? "Before array: " + Ltrim( Str( Memory(MEM_TEST) ) )
   FOR F := 1 TO 1000000
      AAdd( aList, { F, Hb_RandomInt(99) , hb_RandomInt(99), Date() - F, F % 2 == 0, hb_RandomInt(99), F * 10   } )
   NEXT
   ? "After array: " + Ltrim( Str( Memory(MEM_TEST) ) )
   aList := {}
   ? "Empty List: " + Ltrim( Str( Memory(MEM_TEST) ) )
   aList := Nil
   ? "Nil: " + Ltrim( Str( Memory(MEM_TEST )) )

   RETURN Nil
test.png
Nota: O copiar/colar do console no windows 10 tá uma bost... vira um linguição.

Liberar memoria ao fechar Formulario com objeto criado

Enviado: 27 Set 2022 23:11
por JoséQuintas
Sei lá se serve pra alguma coisa, é o programa de teste com as várias opções de memory.

Código: Selecionar todos

HB_MEM_CHAR          2097151                                                                                            
HB_MEM_BLOCK         2097151                                                                                            
HB_MEM_RUN           2097151                                                                                            
HB_MEM_VM            2032088                                                                                            
HB_MEM_EMS                 0                                                                                            
HB_MEM_FM            2097151                                                                                            
HB_MEM_FMSEGS              1                                                                                            
HB_MEM_SWAP          4194303                                                                                            
HB_MEM_CONV                0                                                                                            
HB_MEM_EMSUSED             0                                                                                            
HB_MEM_USED         13172736                                                                                            
HB_MEM_USEDMAX      13172736                                                                                            
HB_MEM_STACKITEMS        200                                                                                            
HB_MEM_STACK            4800