Avatar billede Droa Seniormester
24. maj 2013 - 18:40 Der er 12 kommentarer og
1 løsning

Hv ad er AtomicLong?

Hej Eksperter.

Jeg har et lidt underligt spørgsmål, jeg har været igang med at omskrive noget gammelt kode, fra at bruge int til short, da jeg har et multi array med 3 dimensioner, der indeholder et Object, med (ligenu) 4 -variabler.

3xshort
1xreferance til objectet der indeholder mit Array


ligenu har jeg 268.435.456 objecter i mit array

som jeg kan se bruger mit array lige omkring 1gb ram, men der ligger lige under et andet type objekt, jeg aldrig har hørt om før.
java.util.concurrent.atomic.AtomicLong
det bruger 120mb ram, og har 5 mio instancer loaded i hukommelsen?

hvad er det lige, og hvorfor har mit program loaded det så mange gange?

jeg har slick2d kørene i instancen, men jeg mener ikek det er noget som slick bruger
Avatar billede arne_v Ekspert
24. maj 2013 - 18:49 #1
AtomicLong er en wrapper omkring long som garanterer at samtidig brug fra flere traade virker fornuftigt.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html forklarer.

Men jeg ved ikke hvorfor du har 5 millioner af disse.
Avatar billede Droa Seniormester
24. maj 2013 - 19:52 #2
jeg har lidr prøvet at finde problemer med min kode.. jeg har denne i min tråd der fylder mit array

                        synchronized(_map){
                            _map.incLoadedBlocks();
                        }

jeg bruger den i loopet, til at tilbagemelde til hovede tråeden, hver gang den har loaded en block i mit array.

den ser ud til at holde AtomicLong tvunget i hukommenslen, så min garbage collector ikke fjerner dem, som jeg kan se den gør, uden ovenstående sætning.

uden den sætning, ryger den op på 20.000 instancer, og fjerner dem igen.. med sætningen hopper den op på 5 mio, og fryser på det cifer.

jeg går ud fra det er slick2d, der bruger dem, når den loader Updater og Render, til et eller andet?
Avatar billede Droa Seniormester
24. maj 2013 - 20:00 #3
hov.. hvad jeg kan se, ryger den mere op på 22 mio, også ned på 0 igen.. også op på 22 mio igen.. indtil min Baggrundstråd er færdig.. og alt den gør er absolut ingenting.. jeg parser lige trådens loop.


        int i = 0;
        for (short cz = 0; cz<_map.getSizeOfZ();cz++){
            for(short cy = 0; cy<_map.getSizeOfY();cy++){
                for(short cx = 0; cx<_map.getSizeOfX();cx++){
                    try{
                        MapBlock mapblock = _map.getBlock(cx, cy, cz);
                        mapblock = new MapBlock(cx,cy,cz,_map);
                        mapblock.Generate();
                        i++;
                        _map.incLoadedBlocks();
                    }catch(MapException e){
                        break;
                    }
                }
            }
        }
        System.out.println("Blocks loaded: "+i);
Avatar billede arne_v Ekspert
24. maj 2013 - 20:07 #4
Hvad er _map ?
Avatar billede Droa Seniormester
24. maj 2013 - 20:19 #5
Det er intet stort, jeg er bare ved at lære Java struktur bedre at kende, med dens variabler og brug af ram.. jeg er bare ret nysgerrig i hvad jeg gør forkert, siden den klasse går helt amork i at initializere objekter.

Map

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package dk.minsk.games.map;

/**
*
* @author Martin Fryd Wochner
*/
public class Map {
    private MapBlock[][][] _map;
    private short _sizeX = 0;
    private short _sizeY = 0;
    private short _sizeZ = 0;
    private int _loadedBlocks = 0;

    public Map(short x, short y, short z) {
       
        this._sizeX = x;
        this._sizeY = y;
        this._sizeZ = z;
        this._map = new MapBlock[this._sizeZ][this._sizeY][this._sizeX];
    }
   
    public MapBlock getBlock(short x, short y, short z) throws MapException{
        if(z  < this._map.length){
            if ( y < this._map[z].length){
                if (x < this._map[z][y].length){
                    return this._map[z][y][x];
                }
            }
        }
        throw new MapException("Cordinate out of reach",x,y,z);
    }
   
    public short getSizeOfX(){
        return this._sizeX;
    }
   
    public short getSizeOfY(){
        return this._sizeY;
    }
   
    public short getSizeOfZ(){
        return this._sizeZ;
    }
   
    public int getEstBlocks(){
        return _sizeX*_sizeY*_sizeZ;
    }
   
    public int getLoadedBlocks(){
        return this._loadedBlocks;
    }
   
    public void incLoadedBlocks(){
        this._loadedBlocks++;
    }
   
    /**
    * Generate the BlockMap
    */
    public void Generate(){
        MapGenerator mg = new MapGenerator(this);
    }
}


MapBlock

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package dk.minsk.games.map;

import java.util.Random;

/**
*
* @author Martin Fryd Wochner
*/
public class MapBlock {
    private short _x = 0;
    private short _y = 0;
    private short _z = 0;
    private Map _map;
    private byte biome = 0;

    public MapBlock(short x, short y, short z, Map map) {
        _x = x;
        _y = y;
        _z = z;
        _map = map;
    }
   
    public void Generate(){
        Random r = new Random();
        biome = (byte)r.nextInt(127);
    }
   
    public MapBlock getAdjNorth() throws MapException{
        return _map.getBlock(_x, (short)(_y -1), _z);
    }
   
    public MapBlock getAdjSouth() throws MapException{
        return _map.getBlock(_x, (short)(_y+1), _z);
    }
   
    public MapBlock getAdjWest() throws MapException{
        return _map.getBlock((short)(_x-1), _y, _z);
    }
   
    public MapBlock getAdjEast() throws MapException{
        return _map.getBlock((short)(_x+1), _y, _z);
    }
   
    public MapBlock getAdjDown() throws MapException{
        return _map.getBlock(_x, _y, (short)(_z+1));
    }
   
    public MapBlock getAdjUp() throws MapException{
        return _map.getBlock(_x, _y, (short)(_z-1));
    }
}
Avatar billede Droa Seniormester
25. maj 2013 - 18:22 #6
jeg fandt problemet... det er åbenbart Random klassen, som bruger AtomicLong i en del af algoitmen.
Jeg har valgt at fjerne Random, og bruge en anden methode istedett :)
Avatar billede arne_v Ekspert
25. maj 2013 - 20:04 #7
Maaske havde:


    private static Random r = new Random(); // forudsaetter single threaded
    public void Generate(){
        biome = (byte)r.nextInt(127);
    }

vaeret nok.
Avatar billede Droa Seniormester
25. maj 2013 - 21:53 #8
nu var variablen ubrugelig, da min ide er at lave et Dwarf Fortress kort over en større verden, da jeg syntes sådan en form for automatiseret udvikling er sjov at lege med.
Så min Random og biome variabel var ubrugelig som den var.
Jeg regner lidt med at prøve en anden ide jeg har, ved at først lave højdem og derefter dække med et jordlag, også lave floder, i 5 forskellige faser.
Så jeg har nok dummet mig med at lægge Random variablen ud i Blokken, istedet for at bruge den et mere praktisk sted.

Jeg kan godt se det virkeligt er en dum ide et placere den helt derude, så jeg har valgt at nu oprette den i min MapGenerator Klasse, hvor den istedet danner punkter tilfældige steder på kortet, der fortæller forskellige ting, som "højde" og "temperatur i vandhøjde", som den nu kan bruge til at udregne nabo-blokkes data imellem disse "noder".

Det satte os hastigheden op, af selve oprettelsen af kortet.
Men tak for ideen med at gøre den static, det var en ret god ide, lægger du et svar?
Avatar billede arne_v Ekspert
25. maj 2013 - 23:51 #9
Og bemaerk at ikke bare er det hurtigere med kun en enkelt Random instans, men de genererede tal bliver formentligt ogsaa bedre (mere "tilfaeldige") af det.
Avatar billede arne_v Ekspert
25. maj 2013 - 23:51 #10
svar
Avatar billede Droa Seniormester
26. maj 2013 - 08:38 #11
Ja en computer har det ikke helt så godt med at prøve at lave tilfældige tal, jeg tror jeg læste på http://www.numberphile.com/ engang for nogen måneder siden, at den bruger en meget sjov måde at finde sine tal på
a = tilfældigt tal fra bagrunden
X1 = rigtigt stort tilfældigt tal fra bagrunden
a = rigtigt stort primtal
X = tilfældigt tal
b = et andet rigtigt stort primtal
m = højeste tal

(aX1+b)%m = X2
og at man så Next'er X2 til X1 til man føler tallet er tilfældigt.. det må jo os koste en del cpu i længden :)

er ihvertfald det jeg fik ud af videoen https://www.youtube.com/watch?v=SxP30euw3-0

men jeg kunne tage fejl.. men det fortæller bare hvorfor Random bruger Long, siden de skal være så store tal :)
Avatar billede arne_v Ekspert
26. maj 2013 - 15:59 #12
X(t) = (a * X(t-1) + b) % m

er en saakaldt LCG.

:-)
Avatar billede arne_v Ekspert
26. maj 2013 - 16:01 #13
Hvis du vil laese lidt om tilfaeldige tal saa har jeg skrevet 3 guides:

http://www.eksperten.dk/guide/680
http://www.eksperten.dk/guide/686
http://www.eksperten.dk/guide/951
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