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): 一个或多个(一般是字节的整数位)字节构成。
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[]; //第二项
}
5.什么是魔数(开始几个字节表示文件类型,区分拓展名(文件类型))
1.改魔数就可以改文件的类型,而改拓展名不可以改文件内容的类型
2.magic 在项目的头可以判断他是class文件
-----CA FE BA BE (咖啡 宝贝)
-----CA FE DE AD(对象持久化文件,技术更新,已经没落)
3.魔数使用
1.判断魔数值判断文件真正的类型
2.文件上传可以找到文件的类型
文件
1.文本文件没有魔数值(直接可以读出来)
2.二进制文件(有魔数值)
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.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
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