# Speicheverbrauch einer Datenstruktur ermitteln



## huckfinn (11. Okt 2006)

Hi folks,

Wie kann man den Speicherverbrauch einer Datenstruktur ermitteln. In Delphi gibt es z.B. einen sizeOf() Operator. 

Hintergrund zur Frage. Ich habe einen Test mit JUnit für einen selbstgeschriebenen IdentCache der auch fix ist 100000 Einträg zufällig ermitteln und in die Cachestruktur dauert 1,8 Sekunden und ich dachte nehmen wir mal 1 Mill. und da kam de Heap.  Nun ist die Speicherstruktur der Datencontainer theoretisch nicht 256m groß ???:L. 


```
public void testClear() {
        int m=100000; // m= 1000000; HeapOverflow;
        System.out.println("fill cache with "+m+" values and clear");
        IdentCache cache = new IdentCache();
        java.util.Random r = new Random(); int cnt=0;
        for (int i = 0; i < m; i++) {
            int random = r.nextInt();
            if (cache.get(random)==null) {
                 cache.add("S"+Integer.toString(random),random,
                         new String("VALUE"+Integer.toString(random)));
                 cnt++;
            }     
        }
        System.out.println(cnt+" value in map.");
        cache.clear();
        System.gc();
        assertTrue(" Cache ist leer!",cache.getEntries().size()==0);
    }
```

Ich habe einen Key String im Mittel 8 Zeichen+1 Prefix  = 18 Byte
Ich habe einen Integer = 4 Byte.
Ich habe Containerdaten Integer "VALUE"+ 8 Zeichen für den Integer = (20) Byte

Ich habe die pointer in der TreeMap (BinaryTree) für die Suche nach Key 
vermutlich left, adress, right of int 26 Byte;
Ich habe die pointer in der TreeMap (BinaryTree) für die Suche nach int dito 26 Byte;

Summe macht 22+52 = 74 Byte und wo ist das restliche Speicher? 

Wie kann man ermitteln was die Kiste (JVM) wirklich verbraucht.

Danke und Bis denne huckfinn.

PS.:Ich hänge mal den Kode an



```
public class IdentCache {
    /** Die Token - Ident Relation */   
    TreeMap  tokenMap = new TreeMap(); 
    /** Die  Ident - Token Relation */   
    TreeMap  identMap = new TreeMap();    
    //___CONSTRUCT______________________________________________________________
    /** Einfacher Konstruktor */
    public IdentCache() {  super();  }
    //__________________________________________________________________________
    /** Wertepaar hinzufügen 
        @param token StringToken
        @param ident Indentifikatornummer */
    public void add (String token, int ident) 
     throws IndexOutOfBoundsException { add(token, ident, null); }
    //__________________________________________________________________________
    /** Wertepaar mit Datenobjekt hinzufügen 
        @param token  StringToken
        @param ident  Indentifikatornummer 
        @param object Datenobjekt */
    public void add (String token, int ident, Object object) 
     throws IndexOutOfBoundsException {
       IdentCacheEntry identEntry =  (IdentCacheEntry) 
                                               identMap.get(new Integer(ident));
       if (identEntry!=null) throw new IndexOutOfBoundsException(
                "Doppelter Schlüssel '"+ident+"' !");
       IdentCacheEntry entry = new IdentCacheEntry(token, ident, object);
       tokenMap.put(token, entry ); identMap.put(new Integer(ident), entry);
    }
    //__________________________________________________________________________
    /** Hole Eintrag über das Token
        @param token StringToken */
    public IdentCacheEntry get(String token) { 
         return (IdentCacheEntry) tokenMap.get(token); 
    }
    //__________________________________________________________________________
    /** Hole Eintrag über den Ident
        @param ident Ident */
    public IdentCacheEntry get(int ident) { 
         return (IdentCacheEntry) identMap.get(new Integer(ident)); 
    }
    //__________________________________________________________________________
    /** Hole Ident über das Token
        @param token StringToken */
    public int getByToken(String token) throws IndexOutOfBoundsException { 
        IdentCacheEntry entry = (IdentCacheEntry) tokenMap.get(token);
        if (entry==null) throw new IndexOutOfBoundsException(
                "Unbekanntes Token '"+token+"' !");
        return entry.getIdent(); 
    }
    //__________________________________________________________________________
    /** Hole Token über den Ident
        @param ident Ident */
    public String getByIdent(int ident) throws IndexOutOfBoundsException { 
        IdentCacheEntry entry =  (IdentCacheEntry) identMap.get(
                                                            new Integer(ident));
        if (entry==null) throw new IndexOutOfBoundsException(
                "Unbekannter Identifier '"+ident+"' !");
        return entry.getToken(); 
    }
    //__________________________________________________________________________
    /** Cache leeren */
    public void clear() { tokenMap.clear(); identMap.clear(); }
    //__________________________________________________________________________
    /** Gebe alle Einträge als indiziertes Array heraus */
    public ArrayList getEntries() {
        return (new ArrayList(identMap.values()));
    }
}
```

Und der IdentCacheEntry:

```
/** Element bestehend aus Ident, Tokennamen und Datenobjekt
 *  für die Konstruktion eines IdentCaches 
 *  @author huckfinn alias Alexander Weidauer
 */
public class IdentCacheEntry {
    //__________________________________________________________________________
    /** Das Klartexttoken z.B. ein XML-Tag */
    private String token = "null";
    //__________________________________________________________________________
    /** Die Ident Variable als ganze Zahl */
    private int ident = -1;
    //__________________________________________________________________________
    /** Datenobjekt */ 
    private Object data = null;
    //__________________________________________________________________________
    /** erweiterter Konstruktor mit Tokenstring und Ident */
    public IdentCacheEntry(String token, int ident) {
        this.token = token; this.ident = ident; }
    //__________________________________________________________________________
    /** erweiterter Konstruktor mit Tokenstring, Ident und Datenobjekt */
    public IdentCacheEntry(String token, int ident, Object data) {
        this.token = token; this.ident = ident; this.data = data; }
   //__________________________________________________________________________
    /** Zugriff auf Feld token lesend */
    public String getToken() { return token;}
    //__________________________________________________________________________    
    /** Zugriff auf Feld token schreibend 
        @param token neuer Wert des Namenstoken */
    public void setToken(String token) { this.token = token; }
    //__________________________________________________________________________
    /** Zugriff auf Feld data lesend */
    public Object getObject() { return data;}
    //__________________________________________________________________________    
    /** Zugriff auf Feld data schreibend 
        @param data neues Datenobjekt */
    public void setObject(String data) { this.data = data; }
    //__________________________________________________________________________    
    /** Zugriff auf Feld ident lesend */
    public int getIdent() { return ident; }
    //__________________________________________________________________________    
    /** Zugriff auf Feld ident schreibend 
        @param ident neues Wert des Ident */
    public void setIdent(int ident) { this.ident = ident; }
}
```


----------



## Leroy42 (11. Okt 2006)

huckfinn hat gesagt.:
			
		

> Nun ist die Speicherstruktur der Datencontainer theoretisch nicht 256m groß ?



Du meinst wahrscheinlich 256 MB?

Es liegt daran, daß bei Aufruf der JVM ein bestimmter Heap-Bereich reserviert
wird, der zur Laufzeit nicht erhöht werden kann. Siehe in der API unter den
Aufrufsparametern von "java" nach.

Eine sizeof-Funktion/Methode gibt es in Java nicht.


----------



## huckfinn (11. Okt 2006)

Hï¿½ ???:L  

Natï¿½rlich meine ich Megabyte in der JVM Option steht ja auch -Xmx$ZAHLm 


> Du meinst wahrscheinlich 256 MB?



Nein nein es geht nicht um die Frage wie ich der JVM mehr Speicher gebe.



> JVM ein bestimmter Heap-Bereich reserviert wird, der zur Laufzeit nicht erhï¿½ht werden kann.



Irgendwas zum Messen der Objektgrï¿½ï¿½e muï¿½ es doch geben. Die Entwickler der JVM kï¿½nnen doch nicht allen Ernstes sagen "He nehmt Java mit einem tollen GarbageCollector, wieviel wir darin verbrauchen  sagen wir nicht. Ihr kiegt den Speicher ja automatisch irgendwann wieder freigegeben". Ich muï¿½ doch irgendwie den Ressourcenverbaruch hochrechnen kï¿½nnen. Wenn ich das nicht kann, gibt mir das ein ungutes Gefï¿½hl.

 Bis denne huck


----------



## SlaterB (11. Okt 2006)

schau dir mal diesen Thread hier an
http://www.java-forum.org/de/viewtopic.php?t=25591
(die hinteren Antworten von mir  )

bzw. Forumsuche z.B. nach totalMemory


----------



## huckfinn (11. Okt 2006)

Hi, 

Ich habe mir die Snippetes angesehen, ok jetzt weisz schon mal wieviel Speicher ueberhaupt verbraucht wird. Aber entschuldige, dass ich nochmal quaengele (irgendwas stimmt mit den Umlauten nicht) . Wie kann ich die Groesze der einzelnen Objekte auf dem Heap messen. Musz ich da ueber eine Introspection ran und alles rekuriv selber messen?

Bis denne huck


----------



## SlaterB (11. Okt 2006)

Sofern es nicht schon jemand anders gemacht und ein Tool bereitgestellt hat, ja 
Aber vielleicht gibts das ja selbst in Java, wer weiß.

Was zählt für dich eigentlich alles zu einem Objekt dazu, z.B. wenn es auf andere verweist, vielleicht sogar wieder auf sich selber..?
Bis auf primitive Datentypen kann so ein Tool wohl kaum selber entscheiden was zu berechnen ist.
Und für die Handvoll Datentypen gibt es sicherlich Tabellen, abhängig vom Betriebssystem. 
Dazu noch feste Eckdaten für Links, Arrays usw.

Sicherlich dennoch wert, irgendwo genauer aufgeführt und abfragbar zu sein, keine Frage, hätte ich auch gerne, falls es jemand weiß/ gemacht hat


----------



## huckfinn (11. Okt 2006)

Hi,
Ich gehe mal von meiner Kenntnis über Deplhi aus
Ich denke ein Objekt ..äh also besser Klasses hat folgende "Speicherfresser"

1. Ihre Adresse in der virtuellen Methodentabelle  4 oder 8 Byte, dann log. die Implentierung der Klassen Methode, Parameter etc. mit zuegörigen 
Adressierungen. Die werden aber nur einmal erzeugt und dann über den Datenstack zur Laufzeit mit den jeweiligen Daten der mehrfach erzeugten Instanzen beschickt.

2. Die primitiven Felder ist klar die kann man messen.

3. Die Felder die auf Klassen zeigen ..sollte ein Adressoperator sein 4 oder 8 Byte je Klasse.

So kenne ich das zumindest von Delphi und dessen RTTI RunTimeTypeInformation (..C++ hat das auch).
Außserdem wird zwischen einen Pointer auf Daten und einen Pointer auf Objekte/ Klassen nicht unterschieden. 
Also ein Teil das mit 


```
Type  TObjectName  = Class Begin
               i1:Integer; // Große statisch meßbar 4Byte mit sizeOf(i1)
               d1:Double; // Große statisch  meßbar 8Byte mit sizeOf(d1)
               s1:String; // Große dynamisch meßbar ??Byte mit sizeOf(s1)
               s2:PChar; // Große dynamisch meßbar ??Byte mit sizeOf(s2)
            ...Obj1:TObject; // Größe 4Byte
            ...Obj2:TObject; // Größe 4Byte
               function name1(parameter) // Größe in virtueller Methodentabelle die brauch ich nicht 
               function name2(parameter) // Größe in virtueller Methodentabelle die brauch ich nicht 
           End;
```

Kodiert ist, kann durch eine Variablendeklaration (Pseudocode)


```
TObjectName name = TObjectName.create();
   Pointer pnt = name;
```

angefaßt werden. Und sizeOf(name) wie auch sizeOf(pnt) gibt mir 4 Byte zurück.
Ich kann rekursiv durch die Struktur von name laufen und die bytes der "Klassen"Pointer 
und Primitive summieren.  

An die virtuelle Methodentabelle kommt man nicht so ohne weiteres ran.

Beantwortet das die Frage?

Bis denne huck


----------



## huckfinn (11. Okt 2006)

Hi,

Ich habe folgenden Link gefunden 
martin.nobilitas.com/java/sizeof.html
die dabei vorgeschlagene Methode über eine vorher/ nachher Messung ist zwar durch die Brust (vor allem das statistische) ins Auge aber erst mal 'n Ansatz 

```
public static long estimateSize(ObjectFactory f) {
		final int n = f.makeHowMany();
		Object[] array = new Object[n];
		giveGarbageCollectionAChance();
		long before = getUsedMemory();
		for (int i = n - 1; i >= 0; i--) {
			array[i] = f.makeObject(i);
		}
		giveGarbageCollectionAChance();
		long after = getUsedMemory();

		return Math.round((double) (after - before) / (double) n);
	}
```

Interessant sind noch diese ermittelten Werte hä ± 2:

Type  	Size (bytes)
java.lang.Object 	8
java.lang.Float 	16
java.lang.Double 	16
java.lang.Integer 	16
java.lang.Long 	16
java.math.BigInteger 	56 (*)
java.lang.BigDecimal 	72 (*)
java.lang.String
	2*(Length) + 38 ± 2
empty java.util.Vector
	80
object reference
	4
float array
	4*(Length) + 14 ± 2

Dann habe ich noch das gefunden
www.javapractices.com/Topic83.cjp

Das läuft aber auch nur über den GC.

Here is a utility which can estimate the size of an object in memory, if the object has a no-argument constructor. It follows the style used by  Java Platform Performance, by Wilson and Kesselman.

(In addition, JDK 1.5 has added an Instrumentation interface, which includes a method named getObjectSize method. However, this method seems to be intended for tool makers.)


```
/**
* Measures the approximate size of an object in memory, given a Class which
* has a no-argument constructor.
*/
public final class ObjectSizer {

  /**
  * First and only argument is the package-qualified name of a class
  * which has a no-argument constructor.
  */
  public static void main(String... aArguments){
    Class theClass = null;
    try {
      theClass = Class.forName(aArguments[0]);
    }
    catch (Exception ex) {
      System.err.println("Cannot build a Class object: " + aArguments[0]);
      System.err.println("Use a package-qualified name, and check classpath.");
    }
    long size = ObjectSizer.getObjectSize( theClass );
    System.out.println("Approximate size of " + theClass + " objects :" + size);
  }


  /**
  * Return the approximate size in bytes, and return zero if the class
  * has no default constructor.
  *
  * @param aClass refers to a class which has a no-argument constructor.
  */
  public static long getObjectSize( Class aClass ){
    long result = 0;

    //if the class does not have a no-argument constructor, then
    //inform the user and return 0.
    try {
      aClass.getConstructor( new Class[]{} );
    }
    catch ( NoSuchMethodException ex ) {
      System.err.println(aClass + " does not have a no-argument constructor.");
      return result;
    }

    //this array will simply hold a bunch of references, such that
    //the objects cannot be garbage-collected
    Object[] objects = new Object[fSAMPLE_SIZE];

    //build a bunch of identical objects
    try {
      Object throwAway = aClass.newInstance();

      long startMemoryUse = getMemoryUse();
      for (int idx=0; idx < objects.length ; ++idx) {
        objects[idx] = aClass.newInstance();
      }
      long endMemoryUse = getMemoryUse();

      float approximateSize = ( endMemoryUse - startMemoryUse ) /100f;
      result = Math.round( approximateSize );
    }
    catch (Exception ex) {
      System.err.println("Cannot create object using " + aClass);
    }
    return result;
  }

  // PRIVATE //
  private static int fSAMPLE_SIZE = 100;
  private static long fSLEEP_INTERVAL = 100;

  private static long getMemoryUse(){
    putOutTheGarbage();
    long totalMemory = Runtime.getRuntime().totalMemory();

    putOutTheGarbage();
    long freeMemory = Runtime.getRuntime().freeMemory();

    return (totalMemory - freeMemory);
  }

  private static void putOutTheGarbage() {
    collectGarbage();
    collectGarbage();
  }

  private static void collectGarbage() {
    try {
      System.gc();
      Thread.currentThread().sleep(fSLEEP_INTERVAL);
      System.runFinalization();
      Thread.currentThread().sleep(fSLEEP_INTERVAL);
    }
    catch (InterruptedException ex){
      ex.printStackTrace();
    }
  }
}
```

Gibt es da nichts deterministischen? Bis denne Huck


----------



## Roar (12. Okt 2006)

Hallo,
wo ist eigentlich dein Problem?
Ich hab deinen code bei mir ausprobiert: eine million mal was in den IdentCache hinzugefügt. 
Ich hab das Programm normal ausgeführt und dann profilet.
Das Programm hat im Windows Task Manager ~80mb ram verbraucht. (die Methoden aus Runtime lieferten das gleiche ergebnis)
Der Profiler hat mir angegeben das Programm verbraucht ~71mb ram, was deiner durchschnittlichen summe für ein IdentCacheEntry objekt mal eine million entspricht
~9 mb zeigte mir der profiler von der vm reserviert an.

Ergo versteh ich jetz nicht wirklich wo dein Problem ist.
Als Anfänger - was du ja offentsichtlich bist, wie man an deinem Code erkennen kann (schlechte Formatierung, IndexOutOfBoundsExceptions werden geworfen, wo IllegalArgumentException und andere passender wären, throws IOOBE im methodenkopf, überall new Integer statt Integer#valueOf() ... ) sollte man sich so geistige ergüsse wie vor allem im andern thread für sich behalten.

als abschileßendes wort: eine million solche objekte hält man auch nicht im speicher, dafür gibts datenbanken.

gruß


----------



## huckfinn (12. Okt 2006)

Hi, 

1. Ich habe das über JUnit direkt aus netbeans heraus  getestet und ps -aux sagt mir das das Ding mit -Xmx256m gestartet wurde. Und.. die Kiste steigt während des Tests mit heapoverflow aus ..soviel zu meinem Test. Ich habe übrigens einen 64Bitter. 

2. danke für den Anfänger ..aber wenn altkluge und Anfänger sich streiten?



> schlechte Formatierung


 Man kan es gut lesen!


> IndexOutOfBoundsExceptions


 Ich fasse es als einen Suchraum auf und der Index ,egal ob assoziativ (Stringkey) oder als Adresse (IntegerKey) ist nicht drin! Ein Argument gehört zu einer Methode ok?


> new Integer


Der Key der Klasse TreeMap will,  besonders bei Java 1.4.2, eine *Klasse* die compareable ist!


> geistige ergüsse wie vor allem im andern thread für sich behalten


 Ist das hier ein Forum um über Java zu disskutieren, oder andere Leute runter zu machen.


> als abschileßendes wort: eine million solche objekte hält man auch nicht im speicher, dafür gibts datenbanken[./quote]..die richtig großen Sachen sind in der Datenbank. Das was ich da gerade anfasse ist nur Lookupstruktur!
> 
> Gut gebrüllt Löwe.  Huckfinn


----------



## huckfinn (12. Okt 2006)

Ach so und mein Problem, 
Ich will  gerne im Vorfeld wissen wie schnell ich auf die Struktur bei wieviel Elementen zugreifen kann. Ist doch 'ne ganz normale Sache oder?
huck


----------



## Roar (12. Okt 2006)

1. ich hab auch einen 64bit prozessor. starte dein programm einfach mal normal oder benutze einen *profiler*!



> Man kan es gut lesen!


 methodenkopf und implementierung gehören nicht in eine zeile und lassen sich so nicht gut lesen



> Ich fasse es als einen Suchraum auf und der Index ,egal ob assoziativ (Stringkey) oder als Adresse (IntegerKey) ist nicht drin! Ein Argument gehört zu einer Methode ok?


 du wirfst eine indexoutofbounds exception wenn dein ident nr (was kein _index_ ist) bereits verwendet wird. "out of bounds" ist die zahl damit noch lange nicht.
illegalargumentexception ist hier richtige, denn das übergebene *argument* an deine *methode* ist ungültig.



> Der Key der Klasse TreeMap will, besonders bei Java 1.4.2, eine Klasse die compareable ist!


 lies weiter: "überall new Integer *statt Integer#valueOf()*"



> Ist das hier ein Forum um über Java zu disskutieren, oder andere Leute runter zu machen.


 du hast aber nunmal mist gelabert (vor allem im andern thread) ...
du behauptest dein programm verbraucht >256mb was nicht stimmt, hast es anscheinend nicht richtig ausprobiert, und möhlst dann rum java sei noob.



> die richtig großen Sachen sind in der Datenbank. Das was ich da gerade anfasse ist nur Lookupstruktur!


1 mio objekte sind viel und gehören in eine datenbank. die operationen aus deiner klasse kann eine datenbank auch und sogar besser ausführen.



> Ach so und mein Problem,
> Ich will gerne im Vorfeld wissen wie schnell ich auf die Struktur bei wieviel Elementen zugreifen kann.


davon stand oben zwar noch nix, aber um dir die frage zu beantworten: die zeit für deine get() operationen beträgt log(n). das ist übrigens auch in TreeMap dokumentiert und sogar ganz deterministisch



> Gut gebrüllt Löwe.


----------



## huckfinn (12. Okt 2006)

Hi, 

Du scheinst ja die Höflichkeit mit Löffeln gefressen zu haben, Danke erst mal für den ersten sinnvollen Hinweiß den *Profiler*. Gibt es den zu SDK dazu oder muß man den kaufen. 

Ok zum Zank:


> methodenkopf und implementierung gehören nicht in eine zeile und lassen sich so nicht gut lesen


 Aber nicht wenn nur eine Zeile in der Methode ist oder diese eine getter Methode! Ich finde das jedefalls so besser man muß nicht so viel blättern und der Code ist ja eindeutig. Außerdem kann dir eigentlich auch egal sein.


> überall new Integer statt Integer#valueOf()"


 Man kann als bei der Abfrage get() anstelle von new Integer tun ..danke für den recht unfreundlich formulierten Tip. Aber in der Speichestruktur selbst offensichtlich kann man da nichts anfangen! Die Frage nach dem Speicher bleibt also oder etwa nicht?


> du wirfst eine indexoutofbounds exception wenn dein ident nr (was kein index ist) bereits verwendet wird. "out of bounds" ist die zahl damit noch lange nicht. illegalargumentexception ist hier richtige, denn das übergebene *argument* an deine *methode* ist ungültig.


 Es geht hier aber nicht um eine Methode sondern eine Adresse oder einen Index den Ident bzw Token innerhalb einer Speicherstrukt bezeichnen. Und wenn dieser nicht existiert ..iste er außerhalb der Grenzen des Suchraums. Kann dir auch egal sein weil es ebenfalls die Frage nach der Speicherung nicht beantwortet oder auch nur annähernd damit zu tun hat. 


> du hast aber nunmal mist gelabert (vor allem im andern thread) du behauptest dein programm verbraucht >256mb was nicht stimmt, hast es anscheinend nicht richtig ausprobiert, und möhlst dann rum java sei noob.


 Weder das eine noch das andere. Ich habe in einer testunit ausprobiert, wie schnell ich auf meine Datenstruktur zugreifen kann und groß sie wird und habe, unerwartet einen Fehler bekommen und in diesem Form zwei adequate Fragen gestellt (..so viel zu Them mist labern). Ich habe lediglich gefragt ob man die Menge die eine Cachestruktur hat hochrechnen kann. Außerdem habe ich mich gewundert, daß es keine Methoden innerhalb von Java gibt die das tun. Deshalb die Diskussion über die JVM im anderen Thread.


> 1 mio objekte sind viel und gehören in eine datenbank. die operationen aus deiner klasse kann eine datenbank auch und sogar besser ausführen.


 Mit Sicherheit kann es eine Datenkbank besser, aber ich brauche eine Indizierungsstruktur von der ich Gründen, die dir egal sein können,  gerne wissen will wie groß sie ist. Egal wie doof anfänger- oder stümperhaft ich bin.


> davon stand oben zwar noch nix, aber um dir die frage zu beantworten


 Wie wärs mit dem Threadnamen und der ersten Post?

Irgendiwe scheinst du ja ein ungestümes Temprament zu haben ..vielleicht die Jugend oder Löwe in dir ..oder was immer auch ROAR bedeuten soll, aber feinsinnig kommunizieren muß du erst noch lernen.

Fleißig weiter brüllen ..los! Huckfinn


----------



## Roar (12. Okt 2006)

ok da mir ja alles egal sein kann: 



> Zitat:
> davon stand oben zwar noch nix, aber um dir die frage zu beantworten
> Wie wärs mit dem Threadnamen und der ersten Post?


äh der trheadname hier heißt "*Speicherverbrauch* einer Datenstruktur ermitteln" und nicht "Geschwindigkeit von Zugriffen auf Datenstruktur ermitteln" das sind 2 verschiedene sachen

auch im ersten post steht nichts von geschwindigkeit, nur "sizeof()", "256mb ram" und "wo ist der restliche speicher"
im ersten post von dir steht sogar dass der code bereits "fix" durchläuft - wo hast du also probleme mit geschwindigkeit?

egal, da du dich eh nich belehren lässt is das in dem thread mein letzter post. zum schulss noch 2  screenshots vom profiler:
eins & zwei 

Roar ist übrigens ein skandinavischer name.


edit @thE_29: nette idee, aber der ObjectOutputStream speichert noch n paar infos dazu, also mehr, als das objekt wirklich speicher belegt.


----------



## thE_29 (12. Okt 2006)

Sowas hier?


```
/******************************************************************************************************************************
   * Methode gibt die Objektgröße zurück
   * @param object Object
   * @return int
   *****************************************************************************************************************************/
  public static long getObjectSize(Object object)
  {
    if(object==null)
      return -1;
    try{
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(object);
      byte[] bytes = baos.toByteArray();
      oos.close();
      baos.close();
      return bytes.length;
    }
    catch(Exception ex)
    {
      ex.printStackTrace(System.out);
    }
    return -1;
  }
```


----------



## huckfinn (12. Okt 2006)

Noch mal an Roar, 

Die Sache mit der Geschwindigkeit ist 'ne Fixe Idee von dir. Wahrscheinlich setzt du das mit "zeitlich abgeschlossen - determiniert" gleich. Wie du aber siehst, gehen alle Messungen der Objektgröße in diesen Thread auße die letzte Post über eine statistische Messung mittels Mehrfachaufruf und GarbageCollection aus, also einer statistischen Aussage. In der ersten Post steht auch, daß ich mit der Geschwindiigkeit zufrieden bin. 

Was soll der Quatsch mit der Belehrung ich dache man diskutiert hier, hast du 'nen Heiligenschein überm Kopf. 

Bis denne Huck


----------



## huckfinn (12. Okt 2006)

Hi thE_29,

Das sieht vielversprechend aus. Man muß wohl noch die Größe der Klassennamen rausfiltern 
oder werden die auch im Speicher gehalten.

Bis denne Huck


----------



## Roar (12. Okt 2006)

ok dann doch


			
				huckfinn hat gesagt.:
			
		

> Die Sache mit der Geschwindigkeit ist 'ne Fixe Idee von dir. Wahrscheinlich setzt du das mit "zeitlich abgeschlossen - determiniert" gleich. Wie du aber siehst, gehen alle Messungen der Objektgröße in diesen Thread auße die letzte Post über eine statistische Messung mittels Mehrfachaufruf und GarbageCollection aus, also einer statistischen Aussage. In der ersten Post steht auch, daß ich mit der Geschwindiigkeit zufrieden bin.


überleg dir erstmal wovon du redest: hast du ein problem mit der geschwindigkeit oder mit dem speicherverbrauch? beide aspekte wurden jetzt eigentlich hinreichend erklärt und gelöst.
den text den ich hier gerade zitiert hab macht in meinen augen übrigens überhaupt keinen sinn. du wirfst da speichermessung und zeitmessung wild durcheinander !?
im ersten post hattest du ein problem mit dem speicherverbrauch
eben hattest du ein problem mit der geschwindigkeit
und jetzt?



> Was soll der Quatsch mit der Belehrung ich dache man diskutiert hier, hast du 'nen Heiligenschein überm Kopf.


 da mir ja eh "alles egal sein kann" lassen wir das mit dem "belehren"


----------



## huckfinn (12. Okt 2006)

Hi, 
Dann schau dir mal den Quellcode in diesem Thread  an:


> Hi,
> 
> Ich habe folgenden Link gefunden
> martin.nobilitas.com/java/sizeof.html
> ...


_

Das ist 'ne statistische Größenmessung.  Die Quellen darunter auch. Ich gebs auf, Prost Huckfinn.

[/quote]_


----------



## Roar (12. Okt 2006)

ja, fein, was hat der quellcode da
a) mit dem ursprünglichen problem zu tun
b) mit der zeitmessung zu tun, von der du in denen letzten posts gesprochen hast?
c) mit dem zu tun was *ich* geschrieben hab?


----------



## hupfdule (12. Okt 2006)

Bis einer weint!

Da zwischen euch zweien heut sowieso nix Gutes mehr zustande kommt, lasst es doch am besten erst mal bleiben. Geholfen ist sonst auch keinem.


----------



## huckfinn (12. Okt 2006)

Noch mal an Roar 
Du redest audauern von Geschwindigkeit um die es hier nicht geht. Was soll der Quatsch willst du streiten. Für einen Streit muß man immer etwas mißverstehen ..das tust du die ganze Zeit. 

Ich danke allne für die konstruktive Hilfe bis denn Huck


----------



## SamHotte (12. Okt 2006)

Naja, huck, vielleicht meint roar ja das da:



			
				huckfinn hat gesagt.:
			
		

> Ach so und mein Problem,
> Ich will  gerne im Vorfeld wissen wie schnell ich auf die Struktur bei wieviel Elementen zugreifen kann. Ist doch 'ne ganz normale Sache oder?
> huck


----------



## huckfinn (12. Okt 2006)

Ja wahrscheinlich hätte ich wieviel Elementen unterstreichen sollen. Was solls es kommt eh nix mehr bei dieser Disskussion raus. Also noch mal vielen Dank an alle Huck


----------



## byte (14. Okt 2006)

Grade folgenden Artikel gefunden: Sizeof for Java


----------



## huckfinn (15. Okt 2006)

Hi,

Danke, das ist genau das was ich suche. Ich meine das im Artikel beschriebene ProfileObject. Die Bemerkung im anderen Thread zum Assemlber und so verstehe ich nicht :wink:, oder besser die Gleichgültigkeit daß es funktioniert wie halt ist und sich keine Platte machen zu müssen. Ich bin als Techniker bzw. Physiker mit der Maßgabe ausgebildet worden immer zu hinterfragen wie etwas funktioniert ..wenigstes in großen Zügen. Das in bestimmen Modellierungen Speichergrößen auftreten können, die sich nicht mit einem Datenbankhandling abfangen lassen, ist glaube ich durchaus denkbar. Das Vorkommen einfach zu ignorieren halte ich für einen Fehler. Vielleicht liegt das ja am Hype um das Produkt. Aber in allen Programmiersprachen die vor der Erfindung von Java gut im Spiel waren und heute auch noch sind,  ist die Optimierung und Realisierung von Speicherstrukturen incl. der Zugriffsalgorithmen, die theoretisch nicht in die Kiste reinpassen können, aber realisiert wurden eine der spannendsten Sportarten der Programmierung.  Wenn man hier die Augen zu macht und sagt (JVM wird schon machen) vergibt  man sich 'ne Menge und dazu ist der Entwurf von Java als Programmiersprache zu gut. Vorallem schätze ich die Bestrebung einen Großteil der Bibliotheken wie für Datenstrukturen und Algorithmen zu *standardisieren*.

Ok das war jetz wirklich die letzt Post dazu. Vielen Dank noch mal Huck


----------



## AlArenal (15. Okt 2006)

Nichts und niemand hält dich in Java davon ab, deinen Code und damit deine Strukturen zu optimieren.

Dass du gewisse Grenzen hast, innerhalb dessen du arbeiten kannst und die die JVM vorgibt, liegt in der Natur von VMs. Bei nativ kompilierenden Sprachen ist es nicht anders. Auch Hardware und OS geben dir Grenzen vor. Da kannst du entweder lange lamentieren, oder diese Grenzen zur Kenntnis nehmen und innerhalb dieser das beste draus machen - deine Entscheidung.

Du solltest mal lernen etwas mehr mit dem Arsch zu programmieren. Man kann sich auch zu tode analysieren und dabei das eigentlich zu lösende Problem aus dem Auge verlieren. Für Grundsätzdiskussionen wird man in der freien Wirtschaft nicht bezahlt.


----------



## byte (16. Okt 2006)

AlArenal hat gesagt.:
			
		

> Du solltest mal lernen etwas mehr mit dem Arsch zu programmieren. Man kann sich auch zu tode analysieren und dabei das eigentlich zu lösende Problem aus dem Auge verlieren. Für Grundsätzdiskussionen wird man in der freien Wirtschaft nicht bezahlt.



Amen Bruder.  Bei den meisten Anwendungen ist es halt auch für die Problemlösung irrelevant, wieviel Speicher das Datenmodell nun tatsächlich einnimmt. Habe in meinem derzeitigen Projekt z.b. grade mit nem recht umfangreichen Datenmodell zu tun. Eine bestimmte Art von Sequenzdiagramm wird zur Laufzeit simuliert und zu diesem Zweck werden die Objekte im Speicher kopiert und manipuliert. Ein kurzer Test hat mir gezeigt, dass ich in der Standard Heap Größe (64 MB) ein mittelgroßes Diagramm ~10.000 mal kopieren könnte. Im realistischen Betrieb sind max. 1000 Kopien realistisch. Damit war das Thema Speicher für mich auch abgehakt.

In der Theorie sind das natürlich interessante Themen, über die man sich so seine Gedanken machen kann, aber wenns dann an die konkrete Realisierung eines Projekts geht, verlierst Du Dich ins Tausendste, wenn Du an der falschen Stelle optimierst. Naja, es sei denn, der Speicherverbrauch ist wirklich ne harte Anforderung des Projekts...


----------



## Guest (21. Dez 2006)

huckfinn hat gesagt.:
			
		

> Hi,
> 
> Du scheinst ja die Höflichkeit mit Löffeln gefressen zu haben, Danke erst mal für den ersten sinnvollen Hinweiß den *Profiler*. Gibt es den zu SDK dazu oder muß man den kaufen.
> 
> ...



Na, nachdem was du hier von dir gibst, muss ich leider ROAR zu 100% Recht geben

Kannste mir mal die Zusammenhänge deiner Aussage wiedergeben?

Die hier!
Es geht hier aber nicht um eine Methode sondern eine Adresse oder einen Index den Ident bzw Token innerhalb einer Speicherstrukt bezeichnen. Und wenn dieser nicht existiert ..iste er außerhalb der Grenzen des Suchraums. Kann dir auch egal sein weil es ebenfalls die Frage nach der Speicherung nicht beantwortet oder auch nur annähernd damit zu tun hat.


----------



## Leroy42 (21. Dez 2006)

:shock: ... und das alles kurz vor Weihnachten?  ???:L  :autsch:  :roll:


----------

