因为Java语言独特性拥有垃圾回收机制,不像C、C++等语言需要写代码去释放内存,
所以初学Java时对JVM
无感,后来面试和工作中遇到JVM
的相关问题,就觉得要想很好
地掌握Java语言来开发,不停留在简单的增删改查阶段,就慢慢开始学习JVM
以便日后
跳槽不被面试官虐得那么惨和升职加薪,于是打算写深入学习Java虚拟机系列
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
等)进行交互
jdk-8u-xxx-windows-x64.exe
:是Oracle官方提供用于生成完整Java开发运行环境的软件
相信每个做过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是Java Development Kit (Java开发工具包),
JDK提供Java编译器、Java运行时环境,以及常用的Java类库
它的作用是用来执行编译Java源代码文件、解释和执行Java字节码等操作
JRE是Java Runtime Environment(Java运行环境),它的作用是用于解释执行Java的字节码文件
这里分情况回答这个问题
再结合上面一开始安装JDK目录的图,不难得出JDK与JRE的关系
从完整性的角度上讲:完整的JDK包含开发Java编译环境、解释和执行环境(JRE),所以它们是包含关系
从只解释和执行字节码文件.class
文件角度上讲:
JRE其实可以独立于JDK存在,因为不需要经过JDK编译.java
源文件生成.class
字节码这一步,所以它们是并列关系
JVM是Java Virtual Mechinal(Java虚拟机),是JRE的一部分,它用来运行java字节码文件的虚拟计算机
所以它们之间的联系可以理解为它们之间的包含关系:JDK>JRE>JVM
即JDK包含JRE,JRE包含JVM,所以总的来说JDK包含了JRE和JVM
它们三者之间的区别则要弄懂Java从编译源文件生成字节码文件与底层计算机交互的过程才比较好回答
详细的执行过程如下图所示
从上往下是你日常开发和运行Java源文件的过程
所以结合我自己的理解回答JDK、JRE、JVM之间的区别如下
JVM能干什么换句话来说就是JVM有什么功能,功能决定它能干什么
JVM的主要功能如下
由于JVM作用操作的对象是Java字节码文件(.class文件),再结合上述的JVM的主要功能,针对某一块功能具体学什么做了一个简图
看完这个简图基本上就明白要学习JVM要学哪些内容
学习JVM主要学习以下内容
这里只做简单引入,后续文章会深入解释
JVM规范
JVM规范主要是学习JVM规范已经制定了一些生成字节码文件约束规范,在开发中java源文件符合这些规范才能被JVM正确地解释和执行
类的装载过程
类的装载过程主要学习类的加载器的分类、特点、作用,类的加载器运行机制(双亲委派机制),类的加载过程
JVM内存分配
JVM内存分配主要学习运行时数据区的内存划分、每块内存的特点、存储的内容、可能会出现内存问题
JVM垃圾回收
JVM垃圾回收主要学习多种垃圾回收算法及其优缺点、垃圾回收器及其特点
Class.forName()
和ClassLoader.loadClass()
有什么区别等等一系列问题,这里只是列举比较高频的问题,
有很多细节问题要是面试官想刨底问,起码能二十道题连环炮来提问
所以学习JVM和对JVM有整体的了解才能很好地跟面试官扯皮,起码不会一两轮就败下来
原文:https://www.cnblogs.com/codeluojay/p/13472555.html