• 02.jvmClass文件结构


    1.class文件的数据结构(jvm只认得class文件)

    1.java虚拟机指令集,符号表 和其他信息

    2.class与类的关系

    一个class对应一个类或一个接口
    一个类/接口 不一定对应一个class(也可以通过动态代理/类加载器直接生成)

    3.class文件格式(二进制组成)

    1.用idea查看,写个启动类查看class,查看目录 out目录 BinEd插件
    2.格式(连续的字节流) 1个字节 2个 4个 8个
    3. fiel–>open as Binary(二进制)–>Hex 16进制来看(1个位==8个二进制)
    4.大端在前 Big-endian 数据低位在内存高位地址,高位在低内存地址 如数字1234(java使用) 4001(1低位) 4002(2) 4003(3) 4004(4高位) !这个表示地址,括号表示数据报错的位置
    小端在前 Little-endian 低在低 高在高 数字1234
    4001(4) 4002(3) 4003(2) 4004(1低位保存在高位)

       计算机组成原理:
        位(相当于二进制)(bit):  1位表示一个二进制数
        字节(byte):             1字节表示8个二进制数
        字(word): 一个或多个(一般是字节的整数位)字节构成。
    
    • 1
    • 2
    • 3
    • 4

    4.class文件数据结构(c语言的结构体的伪结构)

    1.无符号数 描述数字索引,数量 或utf-8字符串 u1 u4 代表几个字节
    没有填充和对齐
    2.表
    1.表的命名以 _info结尾
    2.由多个无符号数或者其他表作为复合数据类型
    3.数组

     ClassFile{ 	
             u4  magic; //代表用4个字节表示magic内容,32个二进制,8个16进制CAFEBABE
             cp_info constant_pool[constant_pool_count-1];//是表,后面代表一个数组,是复合数据类型
     }
     cp_info{ 	
     u1 tag;      //第一项
     u1 info[];  //第二项
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.什么是魔数(开始几个字节表示文件类型,区分拓展名(文件类型))

    1.改魔数就可以改文件的类型,而改拓展名不可以改文件内容的类型
    2.magic 在项目的头可以判断他是class文件
    -----CA FE BA BE (咖啡 宝贝)
    -----CA FE DE AD(对象持久化文件,技术更新,已经没落)
    3.魔数使用
    1.判断魔数值判断文件真正的类型
    2.文件上传可以找到文件的类型
    文件
    1.文本文件没有魔数值(直接可以读出来)
    2.二进制文件(有魔数值)

    1. jdk的版本号
    1.5改版 jdk 1.5   .....java5  ...6...8
     jdk1.2== j2se j2ee
     jdk1.1.8-->javac--->java源代码--->class字节码
     --->45.3
     jdk8-->  ......---> 52
    jdk11-->   ...---> 55
    怎么把jdk版本到class字节码?
     答:45开始是1版本(加上版本号除第一版),jdk6次版本为0了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    ClassFile{
        u4 magic;                 
        u2 minor_version;   //次版本(小版本) 打开class文件顺序一样
        u2 major_version;  //主版本 (大版本) 
         //1(主).8(次)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. jvm向下兼容,向上不兼容

    1.jvm高版本可以执行低版本的class文件

    2.idea看 00 00 00 34 (2位16个二进制4位16进制) 10进制52
    (2位
    4位16进制)
    3.换java版本build编译,执行
    //用jdk1.8(低) 使用 jdk11(高)的class文件,报错
    //ClassVersionError
    //cmd
    java top.jamsee.MyApp

    8.jdk jre与jvm的关系(jdk8)

       java development kit: 包括tools和java语法
       java running evironment:  jdbc swing in/out put java类库 接口图片 math...
       jvm: hotspots
       jdk包含jre,jre包含jvm
        
      compact profiles(紧凑的模块配置,jre工具分3个模块,按需分配,用于减肥)
      jdk9没有jre 使用jlink   
    compact1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    9.compose的体现 jdeps工具可看在哪个包(在jdk bin目录下)

    //cmd 只对class文件有效,可以减少导包
    jdeps -P MyApp.class javac --profile
    compact1 MyApp.java //用compact1编译java文件,如果项目中有compact2就会编译错误
    //不可以为jre减肥

    10.jdk8剪裁jre(ejdk embedded嵌入式)(配合compact)

    #使用 jrecreate命令
    #只有linux有,官网下载
    #解压出来
     tar -zxvf ejdk...
    # cd bin/ 看到jrecreate.bat    #可能报64位系统安装32位查询的错
    yum install glibc.i686
    #为jre减肥,生成只有compact1 的jre,输出的位置
    ./jrecreate.sh --profile compact1 --dest /tmp/
    #统计文件大小
      du -h ./JRE1/
    #写好的class文件放到生成的文件夹的bin目录下
     #使用当前目录的jdk生成,为项目减肥
     ./java top.jamsee.MyApp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    计算机毕业设计(附源码)python智能交通信息管理平台
    Git实操图文详解系列教程(2)——GitHub核心操作
    Abnova丨Abnova 稳定细胞株抗体解决方案
    前端JS算法--插入排序
    关于F大学教学主体偏离的核心矛盾分析
    Android Service介绍
    android存储,内部存储,外部存储,日志
    ​孤网双机并联逆变器下垂控制策略(包括仿真模型,功率计算模块、下垂控制模块、电压电流双环控制模块​)(Simulink仿真)
    Cortex-M3如何跳出BusFault,跳过出错代码,程序往下执行
    flink-sql大量使用案例
  • 原文地址:https://blog.csdn.net/weixin_47039303/article/details/127835269