2009-04-08 5 views
12

Wie hoch ist der Speicherbedarf einer Funktion in einer Klasse?Wie hoch ist der Speicheraufwand einer Java-Methode?

Zum Beispiel

Class A 
{ 
int a 
} 

Class B 
{ 
int a 
int foo(int); 
} 

So 100 Instanzen der Klasse A sollte 80 Bytes sein. Was ist mit 100 Instanzen der Klasse B?

+1

Es wird keine Funktion genannt. Es nennt sich eine Methode. – eleven81

+0

lol, ja, es nennt sich eine Methode, und Sie würden besser einen Test machen. –

+2

Es ist nicht testbar, außer durch das Betrachten der VM-Quelle, es sei denn, Sie tun, was andere tun, und nehmen an, dass die serialisierte Form die gleiche wie die im Speicher ist. – TofuBeer

Antwort

-1

Wahrscheinlich sizeof die v-table-Zeiger auf ein Vielfaches von 16

+0

Klassen beider Objekte haben eine Art Bezug auf ihre Klasse. –

+0

Ja, der Zeiger auf die Tabelle der virtuellen Funktionen. – tpdi

1

Verfahren gespeichert ist, nicht in der serialisierten Form aufgerundet. So einfach ist das.

Bearbeiten: Wie für Objekte in der VM während der Ausführung sollte die Größe konstant sein, unabhängig davon, wie viele Methoden die Klasse des Objekts hat.

4

80 Bytes, da eine Methode nicht im Objekt enthalten ist. Es sei denn, Sie sprechen auch über die "vtable" Art der Sache, in diesem Fall wahrscheinlich 160 Bytes.

Erläuterung zu den 160 Bytes. Die 160 wäre, wenn jedes Objekt seine eigene vtable zugewiesen hätte (was eine mögliche Implementierung ist). Alternativ (und wie in den Kommentaren hervorgehoben wird) wäre eine vtable pro Klasse besser, was 80 + die Größe des Zeigers auf die vtable bedeuten würde (wahrscheinlich 4 oder 8 Bytes, abhängig von der VM). Also 84 oder 88 Bytes.

Diese ganze Sache hängt völlig davon ab, wie die VM Speicher zuweist und mit nicht-finalen Methoden handelt. Ohne zu wissen, wie die bestimmte VM implementiert ist, kann keine der beiden Fragen korrekt beantwortet werden.

+0

Beide Klassen haben irgendeine Art von Verweis auf ihre Klasse (ein Äquivalent zu einem C++ - Vtbl-Zeiger). Es ist nicht so, dass jedes Objekt viele Klasseninformationen auf irgendeiner vernünftigen VM mit sich herumtragen würde. –

+0

Dies ist eine VM-spezifische Implementierung, da es sich um eine C++ - Compiler-spezifische Implementation handelt. – TofuBeer

+0

Tom, du scheinst zu sehr auf die Implementierung von Sun angewiesen zu sein, wenn du meine Antworten kommentierst. Wenn Sie nicht denken können, dass es andere mögliche VM-Implementierungen gibt, weiß ich nicht, was ich sagen soll. – TofuBeer

1

Gleich, 80! (kurz)

2

Wie einige andere Leute zumindest gesagt haben, wird die Methode nicht in der Serialisierung gespeichert.

Sie können einfach einen Test durchführen, um dies in diesem Beispiel mit dem folgenden Code anzuzeigen.

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 


public class SerializationTest { 

    public static void main(String[] args) { 
     serialize(true); 
     serialize(false); 
    } 

    public static void serialize(boolean aOrB) { 
     FileOutputStream fos = null; 
     ObjectOutputStream out = null; 
     try { 
      fos = new FileOutputStream("output.txt"); 
      out = new ObjectOutputStream(fos); 
      out.writeObject(aOrB ? new A() : new B()); 
      out.close(); 
      fos.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     File file = new File("output.txt"); 
     System.out.println(file.length()); 
    } 

    public static class A implements Serializable { 
     int a = 0; 
    } 

    public static class B implements Serializable { 
     int a = 0; 

     public int foo(int a) { 
      return a; 
     } 
    } 
} 

Für mich ist diese ausdruckt

48 
48 
+4

Die Serialisierung spiegelt nicht unbedingt die Art und Weise wider, in der die Daten in einer laufenden VM zugeordnet werden. – TofuBeer

11

Der Aufwand ist ... keine.

Die Methodendefinition und die Codeadresse werden im Klassenobjekt gespeichert, das eine eindeutige Instanz enthält, auf die jede Instanz Ihres Objekts zeigt. Da dies der Fall ist, ob Sie diese Methode hinzugefügt haben oder nicht, ist der Overhead für jedes einzelne Objekt nichts.

+3

Und ich verstehe die Abstimmung nicht, da die Antwort genau ist. – Varkhan

+0

Nicht ich, aber diese Antwort ist nicht genau richtig. Bei der Pflege von Methodendefinitionen gibt es einen Overhead, selbst wenn der Overhead fest ist und nicht von der Anzahl der Instanzen abhängt. Können wir eine Million Methoden haben? Wenn nein, ist Overhead vorhanden. – Pacerier

2

Objekte beider Klassen verwenden ca. 20-24 Byte für 32/64-Bit-JVMs.

Verwandte Themen