|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
[JAVA6]oggetto di "dimensione fissa"
Nel java6, che voi sappiate, hanno introdotto "built-in" la possibilità di sapere quanta memoria centrale un oggetto occupa?
Con la java5 utilizzo il metodo descritto in questo articolo ma mi domando, essendo che nella nuova six version ci hanno messo pure un database intero, se si sono ricordati di inserire nelle librerie ufficiali questa funzionalità moolto utile per parecchi programmatori!
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
ops ....ho notato che il titolo della discussione è un pò ambigua rispetto al corpo del messaggio: per "dimensione fissa" intendo la possibilità che ci sia una qualche collezione (tipo hashmap) che, nella fase di istanziazione, permetta di definire la quantità massima di memoria centrale che la collezione di oggetti occuperà e, nel quel caso si tenti di superare la soglia inserendo un nesimo oggetto, la chiamata del metodo .put generi errore o qualche altro tipo di "paradigma" per notificare l'avvenuto superamento della quantità massima di memoria disponibile.
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi usare un agente strumentale (java.lang.instrument). Cosa che avrebbe dovuto fare anche chi ha scritto l'articolo che citi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Questa mi è nuova... che so sti agenti "strumentali"? ...ne ho sentito parlare ma per lo più mi sembra che vengano utilizzati per il profiling delle applicazioni.....
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
whops. Non so perchè ho pensato subito "guarda questo che non usa gli agenti" senza neanche guardare la data
. Mea grandissima culpa. Domani leggendo un articolo del '98 e penserò "ma guarda questo che non usa Swing!".Esempio e ci leviamo il pensiero. Io parto sempre dall'idea "questo è lo strumento che voglio". In questo caso io voglio poter dire: long dimensioneInByte = SizeAgent.getSizeOf(reference); La cosa si rivela alquanto semplice. Questo è l'agente strumentale. Una nota: lo chiamo "strumentale" per non usare "di strumentalizzazione" perchè francamente mi fa schifo Codice:
package it.tukano.sizeagent;
import java.lang.instrument.*;
public class SizeAgent {
private static volatile Instrumentation instrumentationInstance;
public static void premain(String args, Instrumentation inst) {
instrumentationInstance = inst;
}
public static long getSizeOf(Object reference) {
return
instrumentationInstance == null || instrumentationInstance == null ?
-1 :
instrumentationInstance.getObjectSize(reference);
}
}
Codice:
Manifest-Version: 1.0 Premain-Class: it.tukano.sizeagent.SizeAgent java -cp .;SizeAgent.jar -javaagent:SizeAgent.jar Main Occhio però che il "sizeOf" di una mappa è la dimensione dell'oggetto HashMap, non di ciò che contiene. Per fare quello che ti serve dovrai probabilmente creare una mappa i cui metodi aggiungi e rimuovi registrino la dimensione dei nuovi arrivati e dei vecchi in partenza.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
![]() http://www.javaworld.com/javaforums/...age=0#Post7552 (come poi dici tu...conta solo le references) |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Conta la dimensione dell'oggetto che è poi la dimensione dei suoi campi. Siccome i campi sono puntatori ogni oggetto è relativamente leggero. Penso valga la pena di precisare che il getSizeOf di Instrumentation è il sizeof di C: è fatto con il sizeof di C.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Codice:
E:\>javac SizeAgent.java
SizeAgent.java:1: package java.lang.instrument does not exist
import java.lang.instrument.*;
^
SizeAgent.java:4: cannot resolve symbol
symbol : class Instrumentation
location: class SizeAgent
private static volatile Instrumentation instrumentationInstance;
^
SizeAgent.java:6: cannot resolve symbol
symbol : class Instrumentation
location: class SizeAgent
public static void premain(String args, Instrumentation inst) {
^
3 errors
E:\>java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode)
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
per cui in teoria si potrebbe usare lo stesso metodo usato nel link(usare la reflection per procurarsi tutti i riferimenti dell'oggetto ricorsivamente), ma fatto con l'instrument
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Mmmmhhhhh... prova a fare un:
javac -version xthebol Probabilmente nel caso di frank creerei un programma a parte che gestisca la struttura dati oppure ripiegherei sulla trasformazione dei dati in forma "binaria", usando quindi un ByteBuffer per contenerli. Nel primo caso somiglierebbe tanto ad un database in memoria, Nel secondo alloco un ByteBuffer di 32 megabyte e quella diventa la mia struttura dati. Il primo salva la capra, il secondo i cavoli. La capra è la possibilità di lavorare con degli oggetti. Connetto le due jvm tramite JNI, monitoro la seconda con JMX e sono a posto. Butto un po' di ram per il processo della seconda JVM. I cavoli sono l'esatto controllo sulla quantità di memoria occupata. Non so ma penso che tenterei col buffer. Ma dipende anche dai dati.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Oct 2005
Messaggi: 17
|
Leggeti la doc della classe File in java 6, trovi sicuramente novità che ti interesseranno
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
mhhh... devo essermi perso qualcosa. Che c'è in java.io.File che può esserci utile?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
ho creato il file jar e ho inserito il class con il codice compilato postato da pgi, però non riesco a capire come istanziare la classe SizeAgent nel mio progetto, o meglio, non ho capito se questa classe la devo anche inserire insieme alle classi del mio progetto oltre che passarla come file jar al main.....
ps: cmq il problema di compilazione era dovuto, come diceva giustamente pgi, alla versione del javac che era ferma alla 1.4
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- Ultima modifica di Frank1962 : 11-05-2007 alle 00:20. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Includi il jar nel classpath (con -cp in esecuzione e compilazione) e quando vuoi la dimensione di un oggetto blublu semplicemente scrivi:
long size = SizeAgent.getSizeOf(blublu); Ricordati anche di passare alla JVM l'agente con -javaagent:SizeAgent.jar
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Codice:
String aux = new String("hellooooooooooooooooooo world!!!!");
long dimensioneInByte = SizeAgent.getSizeOf(aux);
ps: ho il sospetto che sto getSizeOf non fa quello che mi aspettavo....
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- Ultima modifica di Frank1962 : 11-05-2007 alle 19:24. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tutti i campi di un'istanza di una classe Java sono puntatori.
Se quel puntatore punta ad un array di 40 petabyte comunque conta per 1 puntatore. Perchè "nell'istanza" c'è il puntatore, non c'è l'array. E' la stessa differenza che c'è tra il sizeof di una struttura c che contiene un array di 100 int ed il sizeof di una struttura c che contiene un puntatore ad int. Nel primo caso conta il "peso" dei 100 interi, nel secondo il "peso" del puntatore.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Quote:
Nel caso della String non è possibile calcolare la dimensione del campo che compone l'oggetto stringa istanziato?
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
E che te la prendi con me?
Ma tu, di preciso, che ci devi fare con 'sta cosa?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
il problema più o meno è questo ......ho un webserver che registra tutte le richieste GET,POST,ecc e le inserisce in un "buffer" in attesa che vengano salvate su database..... questo buffer però dev'essere ovviamente limitato nella dimensione e non superare una certa soglia preimpostata in modo tale che nell'eventualità che ci siano troppe richieste queste non vadino ad occupare tutta la memoria centrale e vengano, anche se non salvate su db, cancellate dal buffer per far posto alle nuove richieste...... spero di essermi spiegato bene (ma temo di no)
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:41.












. Mea grandissima culpa. Domani leggendo un articolo del '98 e penserò "ma guarda questo che non usa Swing!".








