目录
前面说到,像C/C++这类语言编写的程序,它们被编译后,直接转换成了对应平台上的可被CPU直接运行的机器指令,转换之后,原本语言中的数据结构,例如结构体信息都被替换掉了,换成了各个数据在内存中的地址和偏移量,操作系统并不知道原来的数据的类型,例如一段C程序被编译成汇编语言后,结构体信息被拆成了一条条对内存操作的指令,一个个变量都变成了首地址,原本的C代码结构不复存在。Java则不同,我们知道Java语言因为跨平台性的原因,程序在转变成机器可执行的指令之前,需要先翻译成中间语言-字节码文件,字节码有它特定的结构,会将Java中的类型结构信息存储起来,待JVM加载字节码文件时,会保存所有的元数据,元数据也就是原始的类型信息,上篇日志中opp-klass模型里的instanceKlass,它保存了Java类的所有信息,例如里面的方法和变量,也正因为了有了这种机制,JVM才支持“反射”,运行Java程序在运行期间能够动态获取实例对象的类型,方法等信息。
字节序
Java语言实现跨平台性,执行前先被编译成统一字节码文件,.class文件与平台无关,只与JVM有关,之后在不同的操作系统环境(Linux,Windows之类)下由不同的JVM来解释执行.class文件,虽然同一Java程序生成的字节码文件相同,但数据在不同平台上的存储方式是不同的。我们知道,字节数据在计算机中存储,或者在网络中收发,是要按照一定的顺序的,这种字节输入输出和存储的顺序,即字节序,在不同的硬件环境中有所不同。拿网络中收发数据包来举例,在传输层发送的数据包如果太大,就会被拆分成多个包,每一个小的数据包都有序号,接收方接收到每一个包都要按照顺序组装成一个完整的包,这样即使按顺序先发出去的1号包没有被先接收,而是先接收到2号包,接收方也会等待,待1号包接收后先将其递交给上层,如果不严格按照顺序收发,存储,那么通信双方发送的数据就无法正确译码。
大端和小端
前面说到不同的操作平台上,数据存储在内存和磁盘