2009-04-08 5 views
12

Quel est le surcoût de mémoire d'une fonction dans une classe?Quel est le surcoût de mémoire d'une méthode Java?

Par exemple,

Class A 
{ 
int a 
} 

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

Ainsi, 100 instances de la classe A devrait être de 80 octets. Qu'en est-il de 100 instances de classe B?

+1

Ce n'est pas une fonction. C'est ce qu'on appelle une méthode. – eleven81

+0

lol, oui, c'est ce qu'on appelle une méthode, et vous feriez mieux de faire un test. –

+2

il n'est pas testable, sauf en regardant la source VM, sauf si vous faites ce que les autres font et supposer que la forme sérialisée est la même que la forme en mémoire. – TofuBeer

Répondre

-1

Probablement sizeof le pointeur v-table arrondie à un multiple de 16.

+0

Les classes des deux objets auront une sorte de référence à leur classe. –

+0

Ouais, le pointeur vers la table des fonctions virtuelles. – tpdi

1

Le procédé ne sont pas stockées sous la forme sérialisée. C'est aussi simple que ça.

Modifier: En ce qui concerne les objets dans la machine virtuelle pendant l'exécution, la taille doit être constante, quel que soit le nombre de méthodes de la classe de l'objet.

4

80 octets car une méthode n'est pas incluse dans l'objet. A moins que vous ne parliez aussi du type "vtable", auquel cas il y a probablement 160 octets.

Clarification sur les 160 octets. Le 160 serait si chaque objet allouait sa propre vtable (ce qui est une implémentation possible). Alternativement (et comme cela est souligné dans les commentaires), un meilleur moyen serait un vtable par classe, ce qui signifierait 80 + la taille du pointeur vers la vtable (probablement 4 ou 8 octets selon la VM). Donc 84 ou 88 octets. Tout dépend entièrement de la manière dont la machine virtuelle alloue la mémoire et gère les méthodes non finales. Sans savoir comment la VM particulière est implémentée, aucune question ne peut être résolue correctement.

+0

Les deux classes ont une sorte de référence à leur classe (un équivalent d'un pointeur vtbl C++). Ce n'est pas comme si chaque objet transportait des tonnes d'informations de classe sur n'importe quel type de machine virtuelle. –

+0

Il s'agit d'une implémentation spécifique à une machine virtuelle, car il s'agit d'une imiplementation spécifique au compilateur C++. – TofuBeer

+0

Tom, vous semblez être trop centré sur l'implémentation de Sun lorsque vous commentez mes réponses. Si vous ne pouvez pas penser qu'il existe d'autres implémentations de VM possibles, eh bien, je ne sais pas quoi dire. – TofuBeer

1

Égal, 80! (en bref)

2

Comme quelques autres personnes l'ont dit, la méthode n'est pas stockée dans la sérialisation.

Vous pouvez facilement faire un test pour montrer ceci dans cet exemple avec le code suivant.

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; 
     } 
    } 
} 

Pour moi, ce imprime sur

48 
48 
+4

La sérialisation ne reflète pas nécessairement la manière dont les données sont allouées dans une machine virtuelle en cours d'exécution. – TofuBeer

11

Les frais généraux ... rien.

La définition de méthode et l'adresse de code sont stockées dans l'objet Class, qui possède une instance unique vers laquelle pointe chaque occurrence de votre objet. Comme ce serait le cas, que vous ajoutiez ou non cette méthode, le surcoût pour chaque objet individuel n'est rien.

+3

Et je ne comprends pas le vote à la baisse, puisque la réponse est exacte. – Varkhan

+0

Pas moi, mais cette réponse n'est pas exactement correcte. Il y a un surcoût dans la maintenance des définitions de méthodes, même si le surdébit est fixe et ne dépend pas du nombre d'instances. Pouvons-nous avoir un million de méthodes? Si non, alors les frais généraux existent. – Pacerier

2

Les objets des deux classes utilisent environ 20-24 octets pour les JVM 32/64 bits.

Questions connexes