Avatar billede jespersahner Nybegynder
14. november 2004 - 03:11 Der er 8 kommentarer og
1 løsning

Fortolkning af brug af memory: Runtime.getRuntime().freeMemory()

Hvordan bruger og fortolker man brug af memory? Jeg forsøger med:

import java.util.*;
public class Memory {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().totalMemory()+" "+Runtime.getRuntime().freeMemory());
        ArrayList x=new ArrayList();
        for (int i=0;i<1000000;i++) x.add(new Integer(i));
        System.out.println(Runtime.getRuntime().totalMemory()+" "+Runtime.getRuntime().freeMemory());
        ArrayList y=new ArrayList();
        for (int i=0;i<1000000;i++) y.add(new Integer(i));
        System.out.println(Runtime.getRuntime().totalMemory()+" "+Runtime.getRuntime().freeMemory());
        ArrayList z=new ArrayList();
        for (int i=0;i<1000000;i++) z.add(new Integer(i));
        System.out.println(Runtime.getRuntime().totalMemory()+" "+Runtime.getRuntime().freeMemory());
        ArrayList v=new ArrayList();
        for (int i=0;i<1000000;i++) v.add(new Integer(i));
        System.out.println(Runtime.getRuntime().totalMemory()+" "+Runtime.getRuntime().freeMemory());
    }
   
}

- og får flg. output:
2031616 1876408
24272896 1473320
62799872 18498232
66650112 6488824
java.lang.OutOfMemoryError
Avatar billede arne_v Ekspert
14. november 2004 - 10:45 #1
Runtime.getRuntime().totalMemory() er den memory som JVM har fået fra operativ systemet

Runtime.getRuntime().freeMemory() er den memory heraf som er ledig

Den første starter med værdien fra -Xms og har maksimal værdi -fra -Xmx.

Når den sidste går i 0 får du java.lang.OutOfMemoryError.

Hvis du angav -Xmx256m kunen dit program sikkert køre.
Avatar billede jespersahner Nybegynder
14. november 2004 - 14:05 #2
->arne_v: Så der allokeres altså løbende mere memory, idet Runtime.getRuntime().totalMemory() stiger. Egentlig var jeg lidt nysgerrig efter at kigge på, hvor meget forskellige objekter (f.eks. ArrayList vs. array af primitive typer) optager af plads. Det er vel ikke helt gennemskueligt her?
Avatar billede arne_v Ekspert
14. november 2004 - 14:07 #3
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()

giver vel et fornuftigt tal !
Avatar billede jespersahner Nybegynder
14. november 2004 - 14:19 #4
->arne_v: Det synes jeg ikke. Jeg får:
  155208
22799576
44301640
60161288

Jeg ville tro, at sekvensen skulle falde efterhånden som memory bruges (?) - eller rettere jeg ville tro, at det var freeMemory(), der var faldende.
Avatar billede arne_v Ekspert
14. november 2004 - 14:37 #5
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()

angiver used memory og den stiger og når den når max. så dør du

lyder det ikke meget logisk ?
Avatar billede jespersahner Nybegynder
14. november 2004 - 14:57 #6
->arne_v: Ja, det er jo sandt. Hvad jeg måske ikke forstår, er at freeMemory() ikke er faldende (fik vist skrevet noget sludder omkring used memory!), men det hænger vel sammen med, at der løbende allokeres mere memory.

Men som du skriver er det relevant at kigge på used memory og dernæst ændringen i used memory, når man vil vide, hvor meget memory er objekt optager. Ændringen i used memory er her:
155208 (startværdi)
22644368 (x)
21502064 (y)
15859648 (z)

Men hvorfor bruger z her mindre memory, kan man så spørge?
Avatar billede arne_v Ekspert
14. november 2004 - 15:00 #7
Mit gæt vil være er at JVM'en begynder at økonomisere lidt med memory når
den er ved at løbe tør.

Pakker tættere, smider noget overhead ud af memory, et eller andet.
Avatar billede jespersahner Nybegynder
14. november 2004 - 18:11 #8
->arne_v: Smid lige et svar
Avatar billede arne_v Ekspert
14. november 2004 - 18:12 #9
kommer her
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