乐趣区

关于java:面经手册-第23篇JDKJREJVM是什么关系


作者:小傅哥
博客:https://bugstack.cn
Github:https://github.com/fuzhengwei/CodeGuide/wiki

积淀、分享、成长,让本人和别人都能有所播种!????

一、前言

截至到这曾经写了 22 篇面经手册,你看了多少?

???? 其实小傅哥就是借着面经的幌子在讲 Java 核心技术,摸索这些外围知识点面试的背地到底在问什么。

想问一些面试官,是因为大家都在问所以你问,还是你想从这里问出什么? 其实可能很多面试官如果不理解这些技术,往往会被求职者的答案击碎心田,哈哈哈哈哈哈。比方:梅森旋转算法 凋谢寻址 斐波那契散列 启发式清理 Javassist 代理形式 扰动函数 哈希统一 等等。

记住,让懂了就是真的懂,比看水文、背答案要爽的多!嗯,就是有时候烧脑!

二、面试题

谢飞机,小记!,也不晓得咋了,总感觉有些面试 攻击性不大,但侮辱性极强

面试官:谢飞机写过 Java 吗?

谢飞机:那当然写过,写了 3 年多了!

面试官:那,JDKJREJVM 之间是什么关系?

谢飞机:嗯 J J J,JDK 外面有 JRE,JVM 如同在 JRE 里!?

面试官:那,Client 模式、Server 模式是啥?

谢飞机:嗯!?啥?

面试官 :好吧,问个简略的。JVM 是如何工作的? 背答案了吗?

谢飞机:再见,面试官!

三、JDK、JRE、JVM

1. Java 平台规范(JDK 8)

Oracle has two products that implement Java Platform Standard Edition (Java SE) 8: Java SE Development Kit (JDK) 8 and Java SE Runtime Environment (JRE) 8.

JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components.

The following conceptual diagram illustrates the components of Oracle’s Java SE products:

Description of Java Conceptual Diagram

对于 JDK、JRE、JVM 之间是什么关系,在 Java 平台规范中曾经明确定义了。也就是下面的英文介绍局部。

  • Oracle 有两个 Java 平台规范的产品,Java SE 开发工具包(JDK) 和 Java SE 运行时环境(JRE)。
  • JDK(Java Development Kit Java 开发工具包),JDK 是提供给 Java 开发人员应用的,其中蕴含了 java 的开发工具,也包含了 JRE。所以装置了 JDK,就不必在独自装置 JRE 了。其中的开发工具包含编译工具 (javac.exe) 打包工具(jar.exe) 等。
  • JRE(Java Runtime Environment Java 运行环境) 是 JDK 的子集,也就是包含 JRE 所有内容,以及开发应用程序所需的编译器和调试器等工具。JRE 提供了库、Java 虚拟机(JVM)和其余组件,用于运行 Java 编程语言、小程序、应用程序。
  • JVM(Java Virtual Machine Java 虚拟机),JVM 能够了解为是一个虚构进去的计算机,具备着计算机的根本运算形式,它次要负责把 Java 程序生成的字节码文件,解释成具体零碎平台上的机器指令,让其在各个平台运行。

综上 ,从这段官网的平台规范介绍和概念图能够看出,咱们运行程序的 JVM 是曾经装置到 JDK 中,只不过可能你开发了很久的代码,也没有留神过。 没有留神过的最大起因是,没有开发过一些和 JVM 相干的组件代码

对于,各 JDK 版本的平台规范,能够自行比对学习,如下:

  • Java SE 6 Documentation:https://docs.oracle.com/javase/6/docs/
  • Java Platform Standard Edition 7 Documentation:https://docs.oracle.com/javase/7/docs/
  • Java Platform Standard Edition 8 Documentation:https://docs.oracle.com/javase/8/docs/

2. JDK 目录构造和作用

咱们默认装置完 JDK 会有 jdk1.8.0_45jre1.8.0_45,两个文件夹。其实在 JDK 的文件中还会有 JRE 的文件夹,他们两个 JRE 文件夹的构造是一样的。

  • bin:一堆 EXE 可执行文件,java.exe、javac.exe、javadoc.exe,曾经密钥管理工具等。
  • db:内置了 Derby 数据库,体积小,免装置。
  • include:Java 和 JVM 交互的头文件,例如咱们 JVMTI 写的 C++ 工程时,就须要把这个 include 包引入进去jvmti.h。例如:基于 jvmti 设计非入侵监控
  • jre:Java 运行环境,蕴含了运行时须要的可执行文件,以及运行时须要依赖的 Java 类库和动态链接库.so .dll .dylib
  • lib:Java 类库,例如 dt.jar、tools.jar

那么 jvm 在哪个文件夹呢?

可能你之前并没有留神过 jvm 原来在这里:C:\Program Files\Java\jdk1.8.0_45\jre\bin\server

  • 这部分是整个 Java 实现跨平台的最核心内容,由 Java 程序编译成的 .class 文件会在虚拟机上执行。
  • 另外在 JVM 解释 class 文件时须要调用类库 lib。在 JRE 目录下有两个文件夹 lib、bin,而 lib 就是 JVM 执行所须要的类库。
  • jvm.dll 并不能独立工作,当 jvm.dll 启动后,会应用 explicit 办法来载入辅助动态链接库一起执行。

3. JDK 是什么?

综上通过 Java 平台规范 JDK 的目录构造,JDK 是 JRE 的超集,JDK 蕴含了 JRE 所有的开发、调试以及监督应用程序的工具。以及如下重要的组件:

  • java – 运行工具,运行 .class 的字节码
  • javac– 编译器,将后缀名为.java 的源代码编译成后缀名为.class 的字节码
  • javap – 反编译程序
  • javadoc – 文档生成器,从源码正文中提取文档,正文需符合规范
  • jar – 打包工具,将相干的类文件打包成一个文件
  • jdb – debugger,调试工具
  • jps – 显示以后 java 程序运行的过程状态
  • appletviewer – 运行和调试 applet 程序的工具,不须要应用浏览器
  • javah – 从 Java 类生成 C 头文件和 C 源文件。这些文件提供了连贯胶合,使 Java 和 C 代码可进行交互。
  • javaws – 运行 JNLP 程序
  • extcheck – 一个检测 jar 包抵触的工具
  • apt – 正文解决工具
  • jhat – java 堆剖析工具
  • jstack – 栈跟踪程序
  • jstat – JVM 检测统计工具
  • jstatd – jstat 守护过程
  • jinfo – 获取正在运行或解体的 java 程序配置信息
  • jmap – 获取 java 过程内存映射信息
  • idlj – IDL-to-Java 编译器. 将 IDL 语言转化为 java 文件
  • policytool – 一个 GUI 的策略文件创建和管理工具
  • jrunscript – 命令行脚本运行
  • appletviewer:小程序浏览器,一种执行 HTML 文件上的 Java 小程序的 Java 浏览器

4. JRE 是什么?

JRE 自身也是一个运行在 CPU 上的程序,用于解释执行 Java 代码。

个别像是施行的工作,会在客户现场装置 JRE,因为这是运行 Java 程序的最低要求。

  • bin:有 java.exe 但没有 javac.exe。也就是无奈编译 Java 程序,但能够运行 Java 程序,能够把这个 bin 目录了解成 JVM。
  • lib:Java 根底 & 外围类库,蕴含 JVM 运行时须要的类库和 rt.jar。也蕴含用于平安治理的文件,这些文件包含安全策略 (security policy) 和平安属性 (security properties) 等。

5. JVM 是什么?

其实简略说 JVM 就是运行 Java 字节码的虚拟机,JVM 是一种标准,各个供应商都能够实现本人 JVM 虚拟机。就像小傅哥本人也依照虚拟机标准和手写 JVM 的相干书籍实现了,基于 Java 实现的 JVM 虚拟机。

源码地址 :https://github.com/fuzhengwei/itstack-demo-jvm
内容简介:本代码次要介绍如何通过 java 代码来实现 JVM 的根底性能(搜寻解析 class 文件、字节码命令、运行时数据区等),从而让 java 程序员通过最熟知的 java 程序,学习 JVM 是如何将 java 程序一步步跑起来的。

当然,咱们下载 Oracle 公司的 JVM 与本人实现的相比,要高级的多。他们的设计有一直优化的内存模型、GC 回收策略、自适应优化器等。

另外,JVM 之所以称为虚拟机,次要就是因为它为了实现“write-once-run-anywhere”。提供了一个不依赖于底层操作系统和机器硬件构造的运行环境。

5.1 Client 模式、Server 模式

在 JVM 中有两种不同格调的启动模式,Client 模式、Server 模式。

  • Client 模式:加载速度较快。能够用于运行 GUI 交互程序。
  • Server 模式:加载速度较慢但运行起来较快。能够用于运行服务器后台程序。

批改配置模式文件:C:\\Program Files\\Java\\jre1.8.0_45\\lib\\amd64\\jvm.cfg

# List of JVMs that can be used as an option to java, javac, etc.
# Order is important -- first in this list is the default JVM.
# NOTE that this both this file and its format are UNSUPPORTED and
# WILL GO AWAY in a future release.
#
# You may also select a JVM in an arbitrary location with the
# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
# and may not be available in a future release.
#
-server KNOWN
-client IGNORE
  • 如果须要调整,能够把 client 设置为 KNOWN,并调整到 server 后面。
  • JVM 默认在 Server 模式下,-Xms128M、-Xmx1024M
  • JVM 默认在 Client 模式下,-Xms1M、-Xmx64M

5.2 JVM 构造和执行器

这部分属于 JVM 的外围常识,但不是本篇重点,会在后续的章节中陆续讲到。本章只做一些介绍。

  • Class Loader:类装载器是用于加载类文件的一个子系统,其次要性能有三个:loading(加载),linking(链接),initialization(初始化)。
  • JVM Memory Areas:办法区、堆区、栈区、程序计数器。
  • Interpreter(解释器):通过查找预约义的 JVM 指令到机器指令映射,JVM 解释器能够将每个字节码指令转换为相应的本地指令。它间接执行字节码,不执行任何优化。
  • JIT Compiler(即时编译器):为了提高效率,JIT Compiler 在运行时与 JVM 交互,并适当将字节码序列编译为本地机器代码。典型地,JIT Compiler 执行一段代码,不是每次一条语句。优化这块代码,并将其翻译为优化的机器代码。JIT Compiler 是默认开启

四、总结

  • 这篇的常识并不简单,波及的面试内容也较少,更多的是对接下来要讲到 JVM 相干面试内容的一个开篇介绍,为后续的要讲的内容做一个铺垫。
  • 如果你在此之前没有关注过 JDK、JRE、JVM 的构造和相应的组件配置以及执行模式,那么能够在此基础上持续学习加深印象。另外想深刻学习 JVM 并不太容易,既要学习 JVM 标准也要上手利用实际,所以很倡议先手写 JVM,再实际验证 JVM。
  • 好了,本章节就扯到这了。这些知识点即便分享给大家,也是我本人学习、收录、整顿、验证的过程。互相学习、相互成长,如果有谬误之处,间接留言给我,我会一直的改过。大家一起提高!

五、系列举荐

  • HashMap 外围常识,扰动函数、负载因子、扩容链表拆分
  • ArrayList 也这么多常识?一个指定地位插入就把谢飞机面晕了!
  • 除了 JDK、CGLIB,还有 3 品种代理形式?面试又卡住!
  • ReentrantLock 之偏心锁解说和实现
  • 线程池的介绍和应用,以及基于 jvmti 设计非入侵监控
退出移动版