升职高薪之路——JDK、JRE、JVM三者的有什么关系?

573 阅读3分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战

💢魔数

1. class文件魔数的设计

image.png

2. 什么是魔数

  • 文件内容起始几个字节使用固定的内容来描述该文件类型,因此这几个字节的内容称为魔数。

image.png

3. class文件的魔数是什么

image.png

4. class文件魔数值的来历

image.png

5. 魔数利用

  • 文件大致分为两种类型

  • 文本文件【没有魔数值】

  • 二进制文件

  • 利用魔数判断文件的真实类型

  • 利用魔数判断上传文件的真实类型

💥版本号

1. 人是怎么看版本号的

  • 人看的JDK版本号信息为JDK1.1.8、JDK1.4

  • JDK1.5以及之后改版叫Java5、Java6、Java8(JDK1.8)

2. Class文件版本号的设计

image.png

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

docs.oracle.com/javase/8/do…

image.png

  • JDK6

docs.oracle.com/javase/6/do…

3. JDK8中的Compact Profiles

  • JDK8新特性(JEP161)

  • JavaSE API太多了,能不能按需分配,Compact Profiles的设计目的就是为了给jre减肥

  • Compact Profiles设计目的也是为了给JDK9模块化来打下基础的,因为JDK9是没有JRE目录的,直接使用 jlink按需生成JRE

  • 官网

  • openjdk.java.net/jeps/161

  • 紧凑的好处(Compact紧凑的含义)

  • 更小的Java环境需要更少的计算资源

  • 一个较小的运行时环境可以更好的优化性能和启动时间

  • 消除未使用的代码从安全的角度总是好的

  • 这些打包的应用程序可以下载速度更快

  • Compact Profiles具体的做法

  • JDK8把JavaSE API分成了3个模块(compact1、compact2、compact3)

  • 官方每个模块的列表:

  •  docs.oracle.com/javase/8/do…

  • 每个模块是累加的关系,也就是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

  • docs.oracle.com/javase/8/ja…

  • 我们可以使用EJDK配合compact的设计来去裁剪合适的JRE

  • 可以裁剪出JRE-compact1、JRE-compact2、JRE-compact3、JRE-Full四种JRE出来

  • 主要采用的是jrecreate命令来完成裁剪

  • EJDK的安装(仅支持Linux,不支持window)

  • 官网下载地址

  • www.oracle.com/java/techno…

  • 安装遇到的问题

  • /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/