这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战
💢魔数
1. class文件魔数的设计
2. 什么是魔数
- 文件内容起始几个字节使用固定的内容来描述该文件类型,因此这几个字节的内容称为魔数。
3. class文件的魔数是什么
4. class文件魔数值的来历
5. 魔数利用
-
文件大致分为两种类型
-
文本文件【没有魔数值】
-
二进制文件
-
利用魔数判断文件的真实类型
-
利用魔数判断上传文件的真实类型
💥版本号
1. 人是怎么看版本号的
-
人看的JDK版本号信息为JDK1.1.8、JDK1.4
-
JDK1.5以及之后改版叫Java5、Java6、Java8(JDK1.8)
2. Class文件版本号的设计
3. 主版本和次版本的规则
-
主版本(Major Version):起始值是45,每个JDK大版本发布主版本号向上加1
-
次版本(Minor Version):起始值是0
JDK1.1.8=45(Major)3(Minor)=45.3
JDK8=52(Major)0(Minor)=52.0
JDK11=55(Major)0(Minor)=55.0
-
JVM高版本可以执行低版本class,反之异常
-
java.lang.UnsupportedClassVersionError
JDK、JRE、JVM都是什么关系
1. 字面概念
- JDK:Java Development Kit(Java开发工具包)
- JRE:Java runtime environment(Java运行时环境)
- JVM:Java Virtual Machine(java虚拟机)
2. 官方图解*
- JDK8
- JDK6
3. JDK8中的Compact Profiles
-
JDK8新特性(JEP161)
-
JavaSE API太多了,能不能按需分配,Compact Profiles的设计目的就是为了给jre减肥
-
Compact Profiles设计目的也是为了给JDK9模块化来打下基础的,因为JDK9是没有JRE目录的,直接使用 jlink按需生成JRE
-
官网
-
紧凑的好处(Compact紧凑的含义)
-
更小的Java环境需要更少的计算资源
-
一个较小的运行时环境可以更好的优化性能和启动时间
-
消除未使用的代码从安全的角度总是好的
-
这些打包的应用程序可以下载速度更快
-
Compact Profiles具体的做法
-
JDK8把JavaSE API分成了3个模块(compact1、compact2、compact3)
-
官方每个模块的列表:
-
每个模块是累加的关系,也就是compact2包含compact1的API,compact3包含compact1、compact2的API
-
最后还有一个完整的模块Full Java SE,Full Java SE包含compact1、compact2、compact3
-
jdeps工具使用
-
jdeps即“java dependencies” 的缩写,是Java8中提供的一个工具。在bin目录下
-
jdeps命令显示Java类文件的包级或类级依赖关系。输入类可以是.class文件、目录、jar文件的路径名,或者可以是完全限定的类名称,以分析所有类文件。
-
其中jdeps命令的-P 参数可以查看API所属compact分类
-
使用javac根据profile编译Java源代码
-
语法
-
javac -profile Java源代码
-
可能出现的问题
-
Java源代码中含有不在选中的compact中API ,则在javac的时候会编译报错
-
JDK8裁剪JRE(EJDK)
-
Oracle官网提供了可裁剪的嵌入式JDK称之为EJDK
-
我们可以使用EJDK配合compact的设计来去裁剪合适的JRE
-
可以裁剪出JRE-compact1、JRE-compact2、JRE-compact3、JRE-Full四种JRE出来
-
主要采用的是jrecreate命令来完成裁剪
-
EJDK的安装(仅支持Linux,不支持window)
-
官网下载地址
-
安装遇到的问题
-
/lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
-
因为64位系统中安装了32位程序所以解决方法:
-
yum install glibc.i686
-
使用jrecreate裁剪出四个版本的JRE
jrecreate --profile compact1 --dest /tmp/JRE1/
jrecreate --profile compact2 --dest /tmp/JRE2/
jrecreate --profile compact3 --dest /tmp/JRE3/
jrecreate --dest /tmp/JREFull/