Che endianness utilizza Java nella sua macchina virtuale? Ricordo di aver letto da qualche parte che dipende dalla macchina fisica su cui è in esecuzione, e poi in altri posti ho letto che è sempre, credo, big endian. Che è corretto?Endianness della macchina virtuale Java
risposta
I dati multibyte nei file class
sono memorizzati big-endian.
Da The Java Virtual Machine Specification, Java SE 7 Edition, Chapter 4: The class
File Format:
Un file di classe è costituito da un flusso di byte di 8 bit. Tutte le quantità a 16-bit, 32-bit e 64-bit sono costruite dalla lettura in due, quattro e otto byte consecutivi di 8-bit, rispettivamente. Gli elementi di dati in multibyte vengono sempre memorizzati nell'ordine big-endian, in cui i byte alti vengono prima.
Inoltre, l'operando in un'istruzione bytecode è anche big-endian se si estende su più byte.
Da The Java Virtual Machine Specification, Java SE 7 Edition, Section 2.11: Instruction Set Summary:
Se un operando è più di un byte in dimensioni, allora è memorizzato in big-endian ordine-byte di ordine primo. Ad esempio, un indice a 16 bit senza segno in variabili locali è memorizzato come due byte senza segno,
byte1
ebyte2
quali che il suo valore è(byte1 << 8) | byte2
.
Quindi sì, penso che si possa dire che la Java Virtual Machine utilizza big-endian.
I dati di lavoro effettivi memorizzati nel processo in esecuzione corrisponderanno quasi certamente alla endianess del processo in esecuzione. Generalmente i formati di file (compresi i file di classe) saranno in ordine di rete (big endian).
In genere è difficile dire cosa sta facendo la macchina al di sotto, poiché viene allontanata dalla macchina virtuale. Non è possibile trasmettere uno short[]
a byte[]
come possibile in C e C++. java.nio.ByteOrder.nativeOrder() dovrebbe darti l'endianess sottostante. La corrispondenza con l'endianità è utile quando si utilizzano i buffer NIO non byte.
- 1. PHP ha una macchina virtuale come Java?
- 2. impossibile creare la macchina virtuale java
- 3. Come sono le prestazioni correnti della macchina virtuale Mono?
- 4. Come funziona una macchina virtuale?
- 5. Macchina virtuale da espressione regolare
- 6. Java: sostituzione DataInputStream per endianness
- 7. Modifica data e ora nel BIOS della macchina virtuale
- 8. Come risolvere non è stato possibile creare l'errore della macchina virtuale di Java Virtual Machine Launcher?
- 9. qual è la differenza tra macchina virtuale classica e macchina virtuale in azzurro?
- 10. Accelerazione macchina virtuale per emulatore Android
- 11. Programmazione sotto macchina virtuale - pro e contro
- 12. API KVM per avviare la macchina virtuale
- 13. Golan funziona su una macchina virtuale?
- 14. È possibile replicare una macchina virtuale blu?
- 15. Una macchina virtuale per C++ per l'ottimizzazione delle prestazioni
- 16. Endianness di interi in Python
- 17. Intercettazione della chiamata di arresto della macchina java?
- 18. Android: OutofMemoryError: la dimensione della bitmap supera il budget della macchina virtuale senza motivo Posso vedere
- 19. Endianness su DataInputStream
- 20. Endianness swap senza ntohs
- 21. Array allocazione e accesso sulla macchina virtuale e la memoria contesa Java
- 22. constexpr and endianness
- 23. Endianness nei linguaggi di programmazione
- 24. Utilizzare una macchina virtuale per imparare il montaggio
- 25. Endianness in Unix hexdump
- 26. Puoi programmare/testare CUDA in una macchina virtuale?
- 27. MacOSX Snow Leopard ed Eclipse: errore nell'avvio di Eclipse (nessuna macchina virtuale Java ...)
- 28. Maven 2.1.0 non passa le proprietà di sistema alla macchina virtuale Java
- 29. Intellij idea che mostra errore: impossibile creare la macchina virtuale java
- 30. Spiegazione della tabella virtuale
Questa risposta è altamente fuorviante. Tutti i riferimenti spiegano come i valori multibyte sono memorizzati nei file di classe. E il file di classe utilizza infatti big endian. Tuttavia, in fase di esecuzione, tutte le implementazioni Java che conosco dei dati di archivio di variabili e strutture dati nell'ordine di byte nativo. Molto probabilmente si applica anche agli operandi di istruzioni una volta che il file di classe è stato caricato in un formato eseguibile migliore. Tutto il resto sarebbe tremendamente lento su architetture little endian come i386. – Codo