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文件魔术头
        相关文章
        |
        2月前
        |
        监控 算法 Java
        Java虚拟机(JVM)的垃圾回收机制深度解析####
        本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
        |
        30天前
        |
        监控 算法 Java
        Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
        本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
        35 0
        |
        3月前
        |
        数据库 虚拟化 Windows
        虚拟机数据恢复—XenServer虚拟机磁盘文件丢失的数据恢复案例
        虚拟机数据恢复环境: 某品牌服务器通过同品牌某型号的RAID卡,将4块STAT硬盘为一组RAID10阵列。上层部署XenServer虚拟化平台,虚拟机安装Windows Server系统,每台虚拟机有两个虚拟机磁盘(系统盘 + 数据盘),虚拟机作为Web服务器使用。 虚拟机故障&分析: 机房异常断电导致服务器中一台VPS(XenServer虚拟机)不可用,虚拟磁盘文件丢失。
        |
        27天前
        |
        存储 监控 算法
        深入探索Java虚拟机(JVM)的内存管理机制
        本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
        |
        29天前
        |
        存储 监控 算法
        Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
        本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
        |
        2月前
        |
        机器学习/深度学习 监控 算法
        Java虚拟机(JVM)的垃圾回收机制深度剖析####
        本文深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法、性能调优策略及未来趋势。通过实例解析,为开发者提供优化Java应用性能的思路与方法。 ####
        52 1
        |
        2月前
        |
        监控 Java 开发者
        Java虚拟机(JVM)深度优化指南####
        本文深入探讨了Java虚拟机(JVM)的工作原理及其性能优化策略,旨在帮助开发者通过理解JVM的内部机制来提升Java应用的运行效率。不同于传统的技术教程,本文采用案例分析与实战技巧相结合的方式,为读者揭示JVM调优的艺术。 ####
        58 8
        |
        2月前
        |
        监控 算法 Java
        深入理解Java虚拟机(JVM)的垃圾回收机制
        【10月更文挑战第21天】 本文将带你深入了解Java虚拟机(JVM)的垃圾回收机制,包括它的工作原理、常见的垃圾收集算法以及如何优化JVM垃圾回收性能。通过本文,你将对JVM垃圾回收有一个全新的认识,并学会如何在实际开发中进行有效的调优。
        56 0
        |
        3月前
        |
        存储 算法 Java
        Java虚拟机(JVM)的内存管理与性能优化
        本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
        |
        3月前
        |
        存储 运维 虚拟化
        虚拟化数据恢复——Hyper-V虚拟化故障导致虚拟机文件丢失的数据恢复案例
        在Windows Server上部署的Hyper-V虚拟化环境中,因存储中虚拟机数据文件丢失导致服务瘫痪。北亚企安数据恢复工程师通过物理检测、操作系统及文件系统检测,确定为人为格式化造成,并通过镜像硬盘、重组RAID、分析并恢复文件索引项等步骤,成功恢复数据,最终在新Hyper-V环境中验证并迁移所有虚拟机,确保用户业务恢复正常运行。