Newsgroup: it.comp.java
Titolo: Quanta memoria occupa un oggetto?

Appunto, come fare a sapere quanta memoria occupa un oggetto?
O almeno: dati due oggetti, come distinguere quello che occupa meno
memoria da quello che ne occupa di piů?
Grazie.
	Paolo B.

 Paolo B.


Un modo semplice che conosco, che somiglia parecchio al metodo sizeof()
del C, consiste nel serializzarlo (== trasformarlo in uno stream di
byte) e rilevare la dimensione dello stream. Questo sfortunatamente
implica che l'oggetto debba essere serializzabile; anche se questo
implica semplicemente implementare una interfaccia vuota
(java.io.Serializable) questo puo' costituire un'inconveniente se non
hai il controllo sul codice. (al limite ricordati che puoi estendere la
classe target e implementare Serializable su quella)
Comunque, eccoti un pezzo di codice:
import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
class Prova
{
    /**
     * Dato un oggetto serializzabile ne ritorna
     * la dimensione in bytes
     *
     * @param   anObject    un oggetto Serializable
     * @return  la dimensione dell'oggetto
     *          (-1 in caso di errore
     */
    public static int sizeof(Serializable anObject)
    {
        int size = -1;
        try
        {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(anObject);
            oos.close();
            size = bos.toByteArray().length;
        }
        catch (Exception ex) {}
        return size;
    }
    /**
     * main interno di esempio.
     * Stampa le dimensioni delle stringhe inserite
     * sulla linea di comando
     */
    public static void main(String args[])
    {
        for (int i=0; i<args.length; i++)
        {
            System.out.print("La dimensione di args["+i+"]:");
            System.out.println(sizeof(args[i]));
        }
    }
}
Ecco il risultato di un lancio sul mio PC (WinNT/JDK 1.1.8):
C:\TEMP>java Prova alfa betagamma
La dimensione di args[0]:11
La dimensione di args[1]:16
Spero di averti aiutato.
Ciao,
    Bruno.
--
Bruno Bossola, a Java Developer
Sent via Deja.com 
http://www.deja.com/
Before you buy.

 memoria da quello che ne occupa di più?
Beh... in linea di massima, puoi avere un'idea dalla dimensione del
.class ;)
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 memoria da quello che ne occupa di più?
Se intendi memoria ram utilizzata dall'oggetto, io uso un programmino
per Winzozz che visualizza
lo stato della memoria ram.
Poi ci gioco aggiungendo o togliendo oggetti dal progetto, calcolando la
differenza di memoria utilizzata.
Matteo

byte) e rilevare la dimensione dello stream. 
Ehm, questo ti dice quanto e' grossa la rappresentazione esterna della 
classe, ma nulla su quella interna, a runtime. Ad esempio, in un'oggetto 
serializzato sono riportati per esteso i nomi dei tipi usati (in termini di 
fully qualified names, in caso di oggetti), come stringhe unicode. Una JVM 
orientata alle performance potrebbe avere una specie di constant pool 
globale ed il tipo di ogni attributo (o quelli della signature di un 
metodo) sarebbero rappresentati come indici nel pool.
In quanto interna, non si puo' dire granche' in modo platform-independent 
*e* JVM-independent.. se non qualitativamente: si puo' ipotizzare che la 
dimensione aumenti piu' o meno linearmente con l'aumentare degli attributi 
e del numero di metodi. Volendo si possono fare conti quantitativi un filo 
piu' precisi (le dimensioni dei tipi java sono note e assolute, in termini 
di bit, e si puo' ben ipotizzare che nessuna JVM usi, per dire, 64 bit per 
rappresentare un int, la cui dimensione java e' 32 bit... anche se poi 
anche questo dipende dall'architettura del processore).
Insomma, si possono ottenere informazioni su una piattaforma e su una JVM 
semplicemente usando ps -a con un programmino di prova opportuno. Pero' le 
informazioni ottenute non sono, probabilmente, molto generali.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

 Appunto, come fare a sapere quanta memoria occupa un oggetto?
Ho verificato, empiricamente su windoze, che un array di int  a[] occupa
a.lenght()*4 bytes.
Per induzione, a te le conclusioni.
Mik.

 ma nulla su quella interna, a runtime.
Guarda che "a runtime" ne da' di informazioni, parecchie! Certo, come
tu hai gia' giustamente descritto, sono informazioni che possono essere
un po' "inquinate", ma non al punto di non dare + valore.
Ciao,
    Bruno.
P.S.
Ah, usando la serializzazione e' possibile ottenere gratis una deep
copy dell'oggetto.


del valore, anche se di discreta qualita'.
Semplicemente, non e' necessariamente un buon indice della dimensione in 
memoria, tutto qui. E avevo capito che a quella il msg originale si riferisse. 
;-)
Un oggetto serializzato puo' occupare (molto) piu' spazio del suo 
corrispondente live.


>> memoria da quello che ne occupa di più?
che la rappresentazione serializzata e' la cosa + vicina (che io
conosca) a soddisfare il suo requisito. Ovviamente, resto in attesa di
idee migliori e proposte costruttive (dopo tutto, interessa anche a me).
Ciao,
    Bruno.
--
Bruno Bossola, a Java Developer
P.S.
Ti saluta Roberto Crivelli


Ti saluta Roberto Crivelli
Ehila'! Salutoni anche a lui! Ma sei tu a Milano, o lui e' a Torino? :)


    Bruno.
Si. Molto gentile, grazie mille.
	Paolo B.
PS: sul mio PC (Win98/JDK 1.1.8) il risultato e' identico al tuo!


*e* JVM-independent.. se non qualitativamente: 
[cut...]
Eppure la mia domanda mi pare importante per uno sviluppatore. 
Minimizzare il consumo di memoria puo' essere un requisito da
soddisfare.
Possibile che non ci sia un modo per farlo? In Java c'e' di tutto e
non hanno pensato a una cosa del genere? %-)
Ok, ma almeno in modo platform-dependent *e* JVM-dependent non si
riesce ad ottenere qualcosa di preciso?
Ciao e grazie per le risposte
	Paolo B.


No, io ora sono fisicamente a Milano e lavoro ora per una ditta di
Milano, BancaIMI, la SIM principale del San Paolo (di Torino :-))
Comunque anche prima lavoravamo insieme in Atos (lui a Milano, io a
Torino, ci vedevamo abbastanza spesso), solo che non sapevo che ti
conoscesse.
--
Bruno Bossola, a Java Developer


conoscesse.
Eheh salutoni ad entrambi, dunque. E anche a Milano. :)


riesce ad ottenere qualcosa di preciso?
Si', come ti hanno gia' suggerito, crei un programmino ad hoc (che ad esempio 
crea una, dieci o cento istanze di un oggetto) e usi qualunque metodo la 
piattaforma ti fornisca per vedere l'occupazione di memoria (tipo il task 
manager sotto win32 o ps sotto unix).
Oppure compri un profiler. ;-)
