DOMANDA Peso in Byte di un Oggetto

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Salve ricordo in c++ che per sapere il peso in byte di un tipo come int, String, double basta usare il metodo sizeof(tipo).
Vorrei sapere se anche in Java esiste una cosa del genere ed eventualmente se si potesse fare anche per gli oggetti.
Per esempio per calcolare il peso in byte di un oggetto "Poligono".
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Non c'è e non ce n'è bisogno. Per i tipi primitivi il numero di byte è predeterminato su qualunque sistema:
boolean --> l'unico tipo primitivo per cui non è specificato, in teoria basta un bit ma ovviamente ciò non è possibile, dipende da come la JVM è stata progettata per rappresentarlo (potrebbe anche usare 64 bit)
int, float --> 32 bit (4 byte)
long, double --> 64 bit (8 byte)
short, char --> 16 bit (2 byte)
byte--> 8 bit (1 byte)
Per il resto si possono solo fare delle stime:
sui sistemi operativi a 32 bit un riferimento occupa 4 byte, mentre su quelli a 64 bit 8 byte;
il peso minimo di un oggetto in un sistema op. a 64 bit è di 16 byte, 8 byte nei sistemi a 32 bit;
un modo di stimare il peso di un oggetto è usare il metodo getObjectSize(oggetto) (vedi https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html) tuttavia rimane una stima, non una misura precisa in quanto un oggetto può contenere riferimenti ad altri oggetti, per cui si può stimarne solo il "peso" dei campi interni
 
  • Mi piace
Reazioni: Alessandro001

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Non c'è e non ce n'è bisogno. Per i tipi primitivi il numero di byte è predeterminato su qualunque sistema:
boolean --> l'unico tipo primitivo per cui non è specificato, in teoria basta un bit ma ovviamente ciò non è possibile, dipende da come la JVM è stata progettata per rappresentarlo (potrebbe anche usare 64 bit)
int, float --> 32 bit (4 byte)
long, double --> 64 bit (8 byte)
short, char --> 16 bit (2 byte)
byte--> 8 bit (1 byte)
Per il resto si possono solo fare delle stime:
sui sistemi operativi a 32 bit un riferimento occupa 4 byte, mentre su quelli a 64 bit 8 byte;
il peso minimo di un oggetto in un sistema op. a 64 bit è di 16 byte, 8 byte nei sistemi a 32 bit;
un modo di stimare il peso di un oggetto è usare il metodo getObjectSize(oggetto) (vedi https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html) tuttavia rimane una stima, non una misura precisa in quanto un oggetto può contenere riferimenti ad altri oggetti, per cui si può stimarne solo il "peso" dei campi interni
Grazie, infatti questa domanda posta dal mio professore mi è sembrata abbastanza strana.
Grazie ancora

Inviato da SNE-LX1 tramite App ufficiale di Tom\'s Hardware Italia Forum
 

Andretti60

Utente Èlite
6,440
5,091
Non esiste l'equivalente di sizeof() in Java semplicemente perché 1) non serve (Java è responsabile della allocazione della memoria) e 2) perfino la dimensione dei tipi primitivi rimane a discrezione del linguaggio. Per esempio, un dato di tipo intero anche se dichiarato 32bits sarà poi rappresentato con 64bits in computer con processori a 64bits. Per dati complessi (tipo classi) è praticamente impossibile predirne la dimensione. Questo non è tipico solo di Java, ma di quasi tutti i moderni linguaggi di programmazione. Per esempio, per rendere strutture scritte in C# con programmi scritti in C si utilizza l’attributo StructLayout, e a seconda del suo valore la dimensione del dato cambia.
 
  • Mi piace
Reazioni: Alessandro001

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Non c'è e non ce n'è bisogno. Per i tipi primitivi il numero di byte è predeterminato su qualunque sistema:
boolean --> l'unico tipo primitivo per cui non è specificato, in teoria basta un bit ma ovviamente ciò non è possibile, dipende da come la JVM è stata progettata per rappresentarlo (potrebbe anche usare 64 bit)
int, float --> 32 bit (4 byte)
long, double --> 64 bit (8 byte)
short, char --> 16 bit (2 byte)
byte--> 8 bit (1 byte)
Per il resto si possono solo fare delle stime:
sui sistemi operativi a 32 bit un riferimento occupa 4 byte, mentre su quelli a 64 bit 8 byte;
il peso minimo di un oggetto in un sistema op. a 64 bit è di 16 byte, 8 byte nei sistemi a 32 bit;
un modo di stimare il peso di un oggetto è usare il metodo getObjectSize(oggetto) (vedi https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html) tuttavia rimane una stima, non una misura precisa in quanto un oggetto può contenere riferimenti ad altri oggetti, per cui si può stimarne solo il "peso" dei campi interni
Ciao, sto provando ad usare il metodo getObjectSize() ma mi da errore proprio sopra la chiamata del metodo.
Ho anche implementato java.lang.instrument.*;
Il codice è questo:
Java:
Libro l = new Libro();
long V = getObjectSize((Object) l);
System.out.println("Il valore è: " + V);

Anche passandogli solo "l" non va
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
  • Mi piace
Reazioni: Alessandro001

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Ciao, sto provando ad usare il metodo getObjectSize() ma mi da errore proprio sopra la chiamata del metodo.
Ho anche implementato java.lang.instrument.*;
Il codice è questo:
Java:
Libro l = new Libro();
long V = getObjectSize((Object) l);
System.out.println("Il valore è: " + V);

Anche passandogli solo "l" non va
"ma sei de coccio" ?? ..e non girare la colpa al tuo professore!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
"ma sei de coccio" ?? ..e non girare la colpa al tuo professore!

Inviato dal mio Nexus 5 utilizzando Tapatalk
Ciao, non ho assolutamente dato la colpa al mio prof, ti invito a rileggere il messaggio.
Non continuo a motivare il mio commento per il semplice fatto che siamo in una discussione di TH non in una pagina facebook di 50enni che augurano il buongiorno.

Sent from my SNE-LX1 using Toms Hardware Italia Forum mobile app
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Ciao, non ho assolutamente dato la colpa al mio prof, ti invito a rileggere il messaggio.
Non continuo a motivare il mio commento per il semplice fatto che siamo in una discussione di TH non in una pagina facebook di 50enni che augurano il buongiorno.

Sent from my SNE-LX1 using Toms Hardware Italia Forum mobile app
Vabbè, ma se ti è stato spiegato anche il motivo per cui non è possibile.determinare la dimensione a priori.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Vabbè, ma se ti è stato spiegato anche il motivo per cui non è possibile.determinare la dimensione a priori.

Inviato dal mio Nexus 5 utilizzando Tapatalk
In verità me l'hanno detto in seguito. Comunque non penso che sia una valida argomentazione per reagire in quel modo.
Manco avessi mancato di rispetto a te..
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
In verità me l'hanno detto in seguito. Comunque non penso che sia una valida argomentazione per reagire in quel modo.
Manco avessi mancato di rispetto a te..
Sei permaloso? .. take It easy!

(scusa se ti ho offeso)

Inviato dal mio Nexus 5 utilizzando Tapatalk
 
  • Mi piace
Reazioni: Alessandro001

Alessandro001

Utente Attivo
166
7
CPU
Ryzen 5 1600 3.2GHz
Scheda Madre
MSI B350 Tomahawk
HDD
Seagate ST1000DM010 1 TB
RAM
2X8GB Corsair CMK16GX4M2B3000C15 Vengeance
GPU
RADEON RX 580 NITRO+ Radeon RX 580 8GB GDDR5
Monitor
HP 27FW Monitor 27"
PSU
Cooler Master MasterWatt Lite 700 230V
Case
Aerocool Aero-800
Net
https://www.speedtest.net/result/8773872068.png
OS
Windows 10
Sei permaloso? .. take It easy!

(scusa se ti ho offeso)

Inviato dal mio Nexus 5 utilizzando Tapatalk
No, non sono permaloso è solo che non mi è sembrato adeguato il tuo commento perché poco rispettoso poi non eri nemmeno parte della discussione.
Se non ha dato fastidio al diretto interessato perché dovrebbe dare fastidio a te? Detto questo, non mi sono offeso.
Have a nice day!
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Sei in un "forum" ... è uno spazio condiviso in cui tutti gli utenti "fanno parte della discussione"!!!

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili