Avatar billede martin_schou Nybegynder
15. november 2001 - 09:28 Der er 10 kommentarer og
1 løsning

Memory-leak

Hvad kan være skyld i et memory leak? Jeg har et program, som efter tilpas længe kørsel begynder at lække :-/

Jeg har været programmet efter med en lup, og sat alle objekter til null efterhånden som de blev undværlige. Det hjalp ikke. Jeg har lavet en klasse, hvis eneste opgave er at kalde System.gc();, når hukommelsesniveauet bliver kritisk (<25% fri). Hjalp ikke.

Kan problemet skyldes andet end objekter, der ikke sættes til null? Nogle forslag til, hvordan jeg finder ud af, præcist hvor programmet slår læk? Er der programmer (helst freeware), der er velegnede til dette?
Avatar billede runesoft Nybegynder
15. november 2001 - 10:46 #1
Det kan godt have noget at gøre med din vm

hvis det har noget med dit program at gøre tror jeg du kan analysere det ved hjælp af dette program:
http://java.sun.com/people/billf/heap/index.html
Avatar billede carstenknudsen Nybegynder
15. november 2001 - 11:19 #2
Det er desværre let at lave memory leaks, typisk
ved at  man glemmer at der ofte er mere end en
reference til et objekt. Hvis du finder ud af noget
må du meget gerne skrive det her.
Avatar billede tmceu Praktikant
15. november 2001 - 11:37 #3
Er klasse med System.gc() ikke stort set ubrugelig ? Der er jo ingen garanti for at Garbage Collectoren kører selv om du kalder den.

Hvad med evt. at smide lidt kode...
Avatar billede kristianp Nybegynder
15. november 2001 - 11:45 #4
Det kan være mange ting...
kom med koden...
Avatar billede martin_schou Nybegynder
15. november 2001 - 11:51 #5
tmceu - koden på gc-klassen?

package Tools;

public class MemoryRestorer extends Thread
  {
    private boolean shouldRun = false;
    private float procent = 25;
    private Runtime RT;
    public MemoryRestorer( int _procent )
      {
        RT = Runtime.getRuntime();
        if( _procent > procent && _procent < 75 )
          {
            procent = _procent;
          }
        shouldRun = true;
        start();
      }
    public void run()
      {
        while( shouldRun )
          {
            long Fri = RT.freeMemory();
            long Total = RT.totalMemory();
            float forhold = ( (float) Fri / (float) Total ) * 100;
            if( forhold < procent && Total > 60000 )
              {
                System.gc();
              }
            try
              {
                sleep( 10000 );
              }
            catch( InterruptedException e )
              {
                e.printStackTrace( System.out );
              }
          }
      }     
  }

Men jo - den er stort set ubrugelig. Men den virker i ca 1% af tilfældende, hvor den invoker gc :-). Placebo-effekten du ved - den er også vigtig.

Det andet kode er for stort, rodet, uigennemskueligt og mudret til at fremvise.
Avatar billede carstenknudsen Nybegynder
15. november 2001 - 11:54 #6
Din sidste kommentar forklarer muligvis problemet :)
Avatar billede martin_schou Nybegynder
15. november 2001 - 12:05 #7
Hehe ... ja - det har jeg også overvejet. Ulempen ved at have 1100 linjers kode i en enkelt klasse, et fundament, der overhovedet ikke er designet og en databas der, alene ved at kigge på tabelnavnene, kan konstateres at have syv brud på første normalform.

Udtrykket \"til pis!\" dækker meget godt min reaktion, da den memoryleak dukkede op.
Avatar billede martin_schou Nybegynder
15. november 2001 - 12:38 #8
En databas er i øvrigt en form for el-bas, der i stedet for el drives af data. En mere teknisk forklaring kan jeg dog ikke levere.
Avatar billede martin_schou Nybegynder
15. november 2001 - 15:10 #9
Jeg tror, jeg har fået ram på lækket - men jeg er ikke sikker endnu (et enkelt gennemløb tager på den forkerte side af en time). Tilsyneladende har det hjulpet, at jeg har indført en dø() kommando i eet af mine databærende objekter.

Objektet har 6 eller 7 arrays, som tilsyneladende ikke bliver ryddet af gc. dø() sætter alle klassens globale variabler til null, og kaldes lige inden selve objektet bliver sat til null.

Spændende at se, om det virkelig har hjulpet.
Avatar billede martin_schou Nybegynder
15. november 2001 - 15:49 #10
Jow - min dø()-metode virker. Der er ikke noget læk længere.

Lækket har åbenbart været der hele tiden - har bare ikke arbejdet med nok data, til at det kunne ses.
Avatar billede logical Nybegynder
15. november 2001 - 20:18 #11
Jeg læste lige ordet database et eller andet sted.

Jeg har tidligere set en leak i oracle driver, men ellers vil jeg anbefale dig at huske at close resultset, statements og connections efter brug.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester