JVM学习概述(一)
发布日期:2022-03-30 18:18:28 浏览次数:36 分类:博客文章

本文共 3072 字,大约阅读时间需要 10 分钟。

前言

因为Java语言独特性拥有垃圾回收机制,不像C、C++等语言需要写代码

去释放内存,所以初学Java时对JVM无感,后来面试和工作中遇到JVM

的相关问题,就觉得要想很好地掌握Java语言来开发,不停留在简单的增删

改查阶段,就慢慢开始学习JVM以便日后跳槽不被面试官虐得那么惨和升职

加薪,于是打算写深入学习Java虚拟机系列

JVM是什么

JVM是Java Virtual Machine的缩写,它的英文翻译过来就是Java虚拟机

虚拟机是什么

虚拟机是指通过软件模拟生成具有完整硬件系统功能的、

运行在一个完全隔离环境中的计算机系统,举一个常见使用虚拟机场景例子:

大学期间我用VMWare Workstation软件安装Linux Centos6.8镜像,

模拟生成一个Linux虚拟机运行环境在自己的Win10计算机系统中,

它与Win10系统互不干扰,相互隔离。我把这个Linux虚拟机作为一个服务器,

部署运行写好的JavaWeb程序,供自己和大学同学访问

Java虚拟机(JVM)的理解:

我个人理解为它是通过jdk-8u-xxx-windows-x64.exe

软件来模拟Java字节码的指令集运行环境的计算机系统

它的作用是用来运行Java字节码的指令集与底层的

主流的计算机系统(如LinuxWindowsUnix等)进行交互

jdk-8u-xxx-windows-x64.exe:

是Oracle官方提供用于生成完整Java开发运行环境的软件


JDK、JRE、JVM之间的区别和联系

相信每个做过Java开发的人都会安装过jdk-xu-xxx-windows-x64.exe

这个软件包含了JDK和JRE,以我自己为例,电脑上安装了

jdk-8u-131-windows-x64.exe,安装完成后就会生成下面图片所示的文件夹

装好后还需要自己去手动配置一些Java环境开发的变量比如

Java_Home

配置的是JDK所在的安装目录路径,配置这个是方便计算机快速定位JDK的位置,

能够快速编译Java文件

ClassPath

配置的是JDK下lib的所在目录路径和这个目录下的tools.jar,在后面的类装载过程

能快速加载字节码文件

Path

配置的是JDK下bin目录路径以及它下面的jre下bin目录所在路径,配置这个是

为了方便在命令行运行Java命令

JDK

JDK是Java Development Kit (Java开发工具包),JDK提供Java编译器、

Java运行时环境,以及常用的Java类库,它的作用是用来执行

编译Java源代码文件、解释和执行Java字节码等操作

JRE

JRE是Java Runtime Environment(Java运行环境),它的作用是

用于解释执行Java的字节码文件

JDK与JRE之间的联系

这里分情况回答这个问题

  1. 如果你想调试Java源文件(后缀为.java文件),那么必须得安装JDK来编译才能达到调试的目的
  2. 如果你只想执行编译好的Java字节码文件(后缀为.class的文件),只需要安装JRE即可

再结合上面一开始安装JDK目录的图,不难得出JDK与JRE的关系

从完整性的角度上讲:

完整的JDK包含开发Java编译环境、解释和执行环境(JRE),所以它们是包含关系

从只解释和执行字节码文件.class文件角度上讲:

JRE其实可以独立于JDK存在,因为不需要经过JDK编译.java源文件

生成.class字节码这一步,所以它们是并列关系

JVM

JVM是Java Virtual Mechinal(Java虚拟机),是JRE的一部分,

它用来运行java字节码文件的虚拟计算机

JDK、JRE、JVM之间的联系如下图所示

所以它们之间的联系可以理解为它们之间的包含关系:JDK>JRE>JVM

即JDK包含JRE,JRE包含JVM,所以总的来说JDK包含了JRE和JVM

JDK、JRE、JVM之间的区别

它们三者之间的区别则要弄懂**Java从编译源文件生成字节码文件

并与底层计算机交互的过程**才比较好回答

Java源文件生成字节码文件与底层计算机交互的过程

详细的执行过程如下图所示

从上往下是你日常开发和运行Java源文件的过程

  1. IDEA或者Eclipse编写.Java源文件
  2. JDK将.java文件编译成.class字节码文件
  3. JRE提供Java类库解释.class字节码文件
  4. JVM执行.class字节码文件内容产生指令集并与OS操作系统交互
  5. 操作系统执行对应的指令与硬件交互
  6. 硬件执行执行指令对应的机器码

所以结合我自己的理解回答JDK、JRE、JVM之间的区别如下

  1. JDK拥有编译Java源文件和解释执行字节码文件的运行环境
  2. JRE只拥有解释和执行字节码文件的运行文件的运行环境
  3. JVM只拥有解释和执行字节码文件的运行文件的运行环境(因为JRE包含JVM,JVM是解释执行的核心)

JVM能干什么

JVM能干什么换句话来说就是JVM有什么功能,功能决定它能干什么

JVM的主要功能如下

  1. 通过classLoader寻找和加载class文件
  2. 解释字节码成为指令并执行,提供class文件的运行环境
  3. 进行运行期的内存分配和垃圾回收
  4. 提供与硬件交互的平台

JVM概述主要学习什么

由于JVM作用操作的对象是Java字节码文件(.class文件)

再结合上述的JVM的主要功能,针对某一块功能具体学什么做了一个简图

看完这个简图基本上就明白要学习JVM要学哪些内容

学习JVM主要学习以下内容

这里只做简单引入,后续文章会深入解释

  1. JVM规范
  2. ClassLoader(类的装载过程)
  3. JVM内存分配
  4. JVM字节码的执行引擎
  5. JVM垃圾回收
  6. JVM如何高效并发处理垃圾回收

JVM规范

JVM规范主要是学习JVM规范已经制定了一些生成字节码文件约束规范,

在开发中java源文件符合这些规范才能被JVM正确地解释和执行

类的装载过程

类的装载过程主要学习类的加载器的分类、特点、作用,

类的加载器运行机制(双亲委派机制),类的加载过程

JVM内存分配

JVM内存分配主要学习运行时数据区的内存划分、每块内存的特点、

存储的内容、可能会出现内存问题

JVM垃圾回收

JVM垃圾回收主要学习多种垃圾回收算法及其优缺点、垃圾回收器及其特点


JVM相关高频面试题

  1. 谈谈你对JDK、JRE、JVM三者之间的理解
    (换种问法:JDK、JRE、JVM三者的区别和联系)
  2. 谈谈你是如何理解Java语言与平台之间的无关性
    (换种问法:为什么Java可以做到一次编译到处运行)
  3. 谈谈你对类的加载过程的理解
  4. 谈谈常见的类的加载器有哪些,各自有什么特点
  5. 谈谈双亲委派机制及使用该机制的原因
  6. 双亲委派机制可以被打破吗,如果可以,请谈谈你的理解
  7. 有用过反射吗,请说下反射基本原理及手写一个反射的例子
  8. Class.forName()ClassLoader.loadClass()有什么区别
  9. 谈谈常见JVM的内存区域分配
  10. 谈谈常见的栈溢出和堆溢出原因和解决办法
  11. 谈谈你所知道的垃圾回收算法及垃圾回收器
  12. 有用过哪些JVM调优工具
  13. 谈JVM调优的思路...

等等一系列问题,这里只是列举比较高频的问题,

有很多细节问题要是面试官想刨底问,起码能二十道题连环炮来提问

所以学习JVM和对JVM有整体的了解才能很好地跟面试官扯皮,起码不会一两轮就败下来

转载地址:https://www.cnblogs.com/codeluojay/p/13472555.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Hexo + GitHub 搭建个人博客
下一篇:一文带你了解常见的单例设计模式写法,学会了能跟面试官扯皮

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月11日 17时29分34秒