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月前
        |
        存储 Java 数据安全/隐私保护
        【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
        【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
        36 0
        |
        26天前
        |
        缓存 Java C#
        【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
        【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
        69 0
        |
        6天前
        |
        缓存 监控 Java
        深入理解Java虚拟机(JVM)性能调优
        【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
        |
        8天前
        |
        存储 XML 监控
        JVM工作原理与实战(三):字节码文件的组成
        JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
        26 6
        |
        23天前
        【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
        【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
        |
        1月前
        |
        存储 Java 编译器
        JVM虚拟机内存区域详情
        JVM虚拟机内存区域详情
        15 0
        |
        1月前
        |
        存储 安全 前端开发
        什么是Java虚拟机(JVM),它的作用是什么?
        什么是Java虚拟机(JVM),它的作用是什么?
        |
        1月前
        |
        存储 Java 开发者
        深入理解Java虚拟机(JVM)内存管理
        【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
        |
        2月前
        |
        存储 Linux KVM
        |
        2月前
        |
        存储 Java 编译器
        深入理解JVM - 类文件结构
        深入理解JVM - 类文件结构
        57 1