Speicheverbrauch einer Datenstruktur ermitteln

Status
Nicht offen für weitere Antworten.

huckfinn

Aktives Mitglied
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.

Code:
    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


Code:
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:
Code:
/** 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

Top Contributor
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

Aktives Mitglied
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
 

huckfinn

Aktives Mitglied
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
 
S

SlaterB

Gast
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

Aktives Mitglied
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

Code:
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)

Code:
   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

Aktives Mitglied
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
Code:
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.)

Code:
/**
* 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
 
R

Roar

Gast
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

Aktives Mitglied
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?
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

Aktives Mitglied
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
 
R

Roar

Gast
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

Aktives Mitglied
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
 
R

Roar

Gast
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

Top Contributor
Sowas hier?

Code:
  /******************************************************************************************************************************
   * 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

Aktives Mitglied
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

Aktives Mitglied
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
 
R

Roar

Gast
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

Aktives Mitglied
Hi,
Dann schau dir mal den Quellcode in diesem Thread an:
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 = f.makeObject(i);
}
giveGarbageCollectionAChance();
long after = getUsedMemory();

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

Interessant sind noch diese ermittelten Werte hä ± 2:
.......


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

[/quote]
 
R

Roar

Gast
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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
 

huckfinn

Aktives Mitglied
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

Top Contributor
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

Top Contributor
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...
 
G

Guest

Gast
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.

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

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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
T Google Links in einer Liste Allgemeine Java-Themen 4
T Sinn einer toString Methode Allgemeine Java-Themen 3
P Durchlaufen einer Queue Allgemeine Java-Themen 9
J Größe einer CD ermitteln Allgemeine Java-Themen 10
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
H Länge einer verketteten Liste Allgemeine Java-Themen 4
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
Javafan01 Deklarieren einer Math.random() Zufallszahl Allgemeine Java-Themen 16
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Teil einer URL auslesen Allgemeine Java-Themen 13
J Ordner und Datei Struktur einer War Datei Allgemeine Java-Themen 1
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben