JVM虚拟机-Class文件之魔数

简介: JVM虚拟机-Class文件之魔数

 一、魔数之定义

魔数这个词在不同领域代表不同的含义。在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数;二指程序代码中的魔数,也称魔法值。

    • 大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,怎么识别一个文件的类型呢?这就用到了我们提到的“魔数”。
    • 所谓魔数和魔字符串就是指在代码中出现但没有解释的数字常量字符串,又称魔法值。如果在某个程序中你使用了魔数,那么在几个月或几年后你将很可能不知道它的含义是什么。

    很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。常见文件的魔数如下:

      1. JPEG (jpg),文件头:FFD8FF
      2. PNG (png),文件头:89504E47
      3. GIF (gif),文件头:47494638
      4. TIFF (tif),文件头:49492A00
      5. Windows Bitmap (bmp),文件头:424D
      6. CAD (dwg),文件头:41433130
      7. Adobe Photoshop (psd),文件头:38425053
      8. Rich Text Format (rtf),文件头:7B5C727466
      9. XML (xml),文件头:3C3F786D6C
      10. HTML (html),文件头:68746D6C3E
      11. Email [thorough only] (eml),文件头:44656C69766572792D646174653A
      12. Outlook Express (dbx),文件头:CFAD12FEC5FD746F
      13. Outlook (pst),文件头:2142444E
      14. MS Word/Excel (xls.or.doc),文件头:D0CF11E0
      15. MS Access (mdb),文件头:5374616E64617264204A
      16. WordPerfect (wpd),文件头:FF575043
      17. Postscript (eps.or.ps),文件头:252150532D41646F6265
      18. Adobe Acrobat (pdf),文件头:255044462D312E
      19. Quicken (qdf),文件头:AC9EBD8F
      20. Windows Password (pwl),文件头:E3828596
      21. ZIP Archive (zip),文件头:504B0304
      22. RAR Archive (rar),文件头:52617221
      23. Wave (wav),文件头:57415645
      24. AVI (avi),文件头:41564920
      25. Real Audio (ram),文件头:2E7261FD
      26. Real Media (rm),文件头:2E524D46
      27. MPEG (mpg),文件头:000001BA
      28. MPEG (mpg),文件头:000001B3
      29. Quicktime (mov),文件头:6D6F6F76
      30. Windows Media (asf),文件头:3026B2758E66CF11
      31. MIDI (mid),文件头:4D546864

      二、Class文件中的魔数

      为了方便虚拟机识别一个文件是否是class类型的文件,SUN公司规定每个class文件都必须以一个word(四个字节)作为开始,这个数字就是魔数。魔数是由四个字节的无符号数组成的,Java的.class文件,开头的4个字节是0xCAFEBABE。 这个魔数值在Java还被称作“ Oak”语言的时候(大约是1991年前后)就已经确定下来了。它还有一段很有趣的历史,据Java开发小组最初的关键成员Patrick Naughton 所说:“我们一直在寻找一些好玩的、容易记忆的东西,选择0xCAFEBABE是因为它象征着著名咖啡品牌Peet's Coffee深受欢迎的Baristas咖啡。”下图就是一个编译后的class文件,可以看到文件开头就是cafebabe。

      【注】在IDEA中添加HexView插件即可查看编译后的class文件。

      image.gif编辑

      三、魔数与Class文件的版本

      紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。

      Java的版本号是从45开始的,JDK 1.1之后 的每个JDK大版本发布主版本号向上加1(JDK 1.0~1.1使用了45.0~45.3的版本号),高版本的JDK能 向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,因为《Java虚拟机规范》在Class文 件校验部分明确要求了即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class 文件。

      例如,JDK1.1能支持版本号为45.0~45.65535的Class文件,无法执行版本号为46.0以上的Class文件,而JDK1.2则能支持45.0~46.65535的Class文件。目前最新的JDK版本为13,可生成的Class文件主版本号最大值为57.0。

      上图中的版本号是34,对应的十进制为52,所以对应的JDK版本为1.8。

      从JDK 1.1到13之间,主流JDK版本编译器输出的默认的和可支持的Class文件版本:

      image.gif编辑

      参考资料:

        1. 深入理解Java虚拟机(第三版)-- Class类文件结构_吴声子夜歌的博客-CSDN博客
        2. 各类文件的文件头 魔数_shendeguang的博客-CSDN博客_exe文件魔术头
        相关文章
        |
        1月前
        |
        数据库 虚拟化 Windows
        虚拟机数据恢复—XenServer虚拟机磁盘文件丢失的数据恢复案例
        虚拟机数据恢复环境: 某品牌服务器通过同品牌某型号的RAID卡,将4块STAT硬盘为一组RAID10阵列。上层部署XenServer虚拟化平台,虚拟机安装Windows Server系统,每台虚拟机有两个虚拟机磁盘(系统盘 + 数据盘),虚拟机作为Web服务器使用。 虚拟机故障&分析: 机房异常断电导致服务器中一台VPS(XenServer虚拟机)不可用,虚拟磁盘文件丢失。
        |
        1月前
        |
        Java
        jvm复习,深入理解java虚拟机一:运行时数据区域
        这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
        64 19
        jvm复习,深入理解java虚拟机一:运行时数据区域
        |
        30天前
        |
        存储 算法 Java
        Java虚拟机(JVM)的内存管理与性能优化
        本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
        |
        1月前
        |
        存储 运维 虚拟化
        虚拟化数据恢复——Hyper-V虚拟化故障导致虚拟机文件丢失的数据恢复案例
        在Windows Server上部署的Hyper-V虚拟化环境中,因存储中虚拟机数据文件丢失导致服务瘫痪。北亚企安数据恢复工程师通过物理检测、操作系统及文件系统检测,确定为人为格式化造成,并通过镜像硬盘、重组RAID、分析并恢复文件索引项等步骤,成功恢复数据,最终在新Hyper-V环境中验证并迁移所有虚拟机,确保用户业务恢复正常运行。
        |
        1月前
        |
        SQL 缓存 Java
        JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
        这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
        30 3
        |
        1月前
        |
        存储 算法 Java
        深入理解Java虚拟机(JVM)及其优化策略
        【10月更文挑战第10天】深入理解Java虚拟机(JVM)及其优化策略
        43 1
        |
        1月前
        |
        小程序 Oracle Java
        JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
        这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
        45 0
        JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
        |
        1月前
        |
        存储 安全 Java
        jvm 锁的 膨胀过程?锁内存怎么变化的
        【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
        37 4
        |
        13天前
        |
        Arthas 监控 Java
        JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
        本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
        |
        11天前
        |
        Java Linux Windows
        JVM内存
        首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
        11 1