本文共 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字节码的指令集与底层的
主流的计算机系统(如Linux
、Windows
、Unix
等)进行交互
是Oracle官方提供用于生成完整Java开发运行环境的软件
jdk-8u-xxx-windows-x64.exe
:
JDK、JRE、JVM之间的区别和联系
相信每个做过Java开发的人都会安装过jdk-xu-xxx-windows-x64.exe
,
这个软件包含了JDK和JRE,以我自己为例,电脑上安装了
jdk-8u-131-windows-x64.exe
,安装完成后就会生成下面图片所示的文件夹
装好后还需要自己去手动配置一些Java环境开发的变量比如
Java_Home
:
能够快速编译Java文件
ClassPath
:
能快速加载字节码文件
Path
:
为了方便在命令行运行Java命令
JDK
JDK是Java Development Kit (Java开发工具包),JDK提供Java编译器、
Java运行时环境,以及常用的Java类库,它的作用是用来执行
编译Java源代码文件、解释和执行Java字节码等操作
JRE
JRE是Java Runtime Environment(Java运行环境),它的作用是
用于解释执行Java的字节码文件
JDK与JRE之间的联系
这里分情况回答这个问题
- 如果你想调试Java源文件(后缀为.java文件),那么必须得安装JDK来编译才能达到调试的目的
- 如果你只想执行编译好的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源文件的过程
- IDEA或者Eclipse编写.Java源文件
- JDK将.java文件编译成.class字节码文件
- JRE提供Java类库解释.class字节码文件
- JVM执行.class字节码文件内容产生指令集并与OS操作系统交互
- 操作系统执行对应的指令与硬件交互
- 硬件执行执行指令对应的机器码
所以结合我自己的理解回答JDK、JRE、JVM之间的区别如下
- JDK拥有编译Java源文件和解释执行字节码文件的运行环境
- JRE只拥有解释和执行字节码文件的运行文件的运行环境
- JVM只拥有解释和执行字节码文件的运行文件的运行环境(因为JRE包含JVM,JVM是解释执行的核心)
JVM能干什么
JVM能干什么换句话来说就是JVM有什么功能,功能决定它能干什么
JVM的主要功能如下
- 通过classLoader寻找和加载class文件
- 解释字节码成为指令并执行,提供class文件的运行环境
- 进行运行期的内存分配和垃圾回收
- 提供与硬件交互的平台
JVM概述主要学习什么
由于JVM作用操作的对象是Java字节码文件(.class文件),
再结合上述的JVM的主要功能,针对某一块功能具体学什么做了一个简图
看完这个简图基本上就明白要学习JVM要学哪些内容
学习JVM主要学习以下内容
这里只做简单引入,后续文章会深入解释
- JVM规范
- ClassLoader(类的装载过程)
- JVM内存分配
- JVM字节码的执行引擎
- JVM垃圾回收
- JVM如何高效并发处理垃圾回收
JVM规范
JVM规范主要是学习JVM规范已经制定了一些生成字节码文件约束规范,
在开发中java源文件符合这些规范才能被JVM正确地解释和执行
类的装载过程
类的装载过程主要学习类的加载器的分类、特点、作用,
类的加载器运行机制(双亲委派机制),类的加载过程
JVM内存分配
JVM内存分配主要学习运行时数据区的内存划分、每块内存的特点、
存储的内容、可能会出现内存问题
JVM垃圾回收
JVM垃圾回收主要学习多种垃圾回收算法及其优缺点、垃圾回收器及其特点
JVM相关高频面试题
- 谈谈你对JDK、JRE、JVM三者之间的理解(换种问法:JDK、JRE、JVM三者的区别和联系)
- 谈谈你是如何理解Java语言与平台之间的无关性(换种问法:为什么Java可以做到一次编译到处运行)
- 谈谈你对类的加载过程的理解
- 谈谈常见的类的加载器有哪些,各自有什么特点
- 谈谈双亲委派机制及使用该机制的原因
- 双亲委派机制可以被打破吗,如果可以,请谈谈你的理解
- 有用过反射吗,请说下反射基本原理及手写一个反射的例子
Class.forName()
和ClassLoader.loadClass()
有什么区别- 谈谈常见JVM的内存区域分配
- 谈谈常见的栈溢出和堆溢出原因和解决办法
- 谈谈你所知道的垃圾回收算法及垃圾回收器
- 有用过哪些JVM调优工具
- 谈JVM调优的思路...
等等一系列问题,这里只是列举比较高频的问题,
有很多细节问题要是面试官想刨底问,起码能二十道题连环炮来提问
所以学习JVM和对JVM有整体的了解才能很好地跟面试官扯皮,起码不会一两轮就败下来
转载地址:https://www.cnblogs.com/codeluojay/p/13472555.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!