JVM介绍

1.虚拟机的概念:

  • 1.所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
    • 大名鼎鼎的Visual Box,Mware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
    • 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。
  • 2.无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中

2.什么是Java虚拟机(面试):

  • JVM就是Java虚拟机( Java Virtual Machine),Java虚拟机就是JVM,后面你的笔记都统一写成JVM
  • 1.JVM本质就是一个运行在计算机上的程序,其职责是执行Java字节码文件,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成
  • 2.JVM平台的各种语言可以共享JVM带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器
  • 3.Java技术的核心就是JVM,因为所有的Java程序都运行在JVM内部。
  • 4.JVM就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里

3.JVM参考书目:


4.举例说一下认识的JVM(面试):


5.查看当前JDK中使用的虚拟机类型:

  • 1.查看我的虚拟机类型:这里的HotSpot是指的Oracle JDK版
  • 2.HotSpot的发展历程:
  • 3.重点再介绍下HotSpot:

6.为何学JVM:

  • 1.面试的需要(BATJ、TMD,PKQ等面试都爱问)
  • 2.中高级程序员必备技能
    • 项目管理、调优的需求
  • 3.追求极客的精神:
    • 比如:垃圾回收算法、JIT、底层原理

7.JVM特点:

  • 1.一次编译,到处运行
  • 2.自动内存管理
  • 3.自动垃圾回收功能:
    • 自动垃圾回收机制大大提高了java的性能
    • 垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力

8.JVM位置:

  • 1.JVM是运行在操作系统之上的,它与硬件没有直接的交互
  • 2.Java的体系结构

9.JVM 的功能(重要):

9.1.功能1:解释和运行

  • 1.Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。
  • 2.字节码文件中包含了字节码指令,计算器无法直接执行,Java虚拟机会将字节码文件中的字节码指令实时地解释成机器码,机器码是计算机可以运行的指令。
  • 3.每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

9.2.功能2:内存管理

  • 1.自动为对象、方法等分配内存
  • 2.自动的垃圾回收机制,回收不再使用的对象

Java虚拟机会帮助程序员为对象分配内存,同时将不用的对象使用垃圾回收器回收掉,这是对比C和C++这些语言的一个优势。在C/C++语言中,对象的回收需要程序员手动去编写代码完成,如果遗漏了这段删除对象的代码,这个对象就会永远占用内存空间,不会再回收。所以JVM的这个功能降低了程序员编写代码的难度。

9.3.功能3:即时编译:

a.什么是即时编译:

  • 1.即时编译就是: 对热点代码进行优化,提升执行效率。即时编译可以说是提升Java程序性能最核心的手段
  • 2.在JDK1.1的版本中就推出了即时编译去优化对应的性能,虚拟机在运行过程中如果发现某一个方法甚至是循环是热点代码(被非常高频调用),即时编译器会优化这段代码并将优化后的机器码保存在内存中,如果第二次再去执行这段代码。Java虚拟机会将机器码从内存中取出来直接进行调用。这样节省了一次解释的步骤,同时执行的是优化后的代码,效率较高
  • 3.Java通过即时编译器获得了接近C/C++语言的性能,在某些特定的场景下甚至可以实现超越

b.对Java性能低的主要原因和跨平台特性说明:

  • 1.Java语言如果不做任何的优化,性能其实是不如C和C++语言的。主要原因是:在程序运行过程中,Java虚拟机需要将字节码指令实时地解释成计算机能识别的机器码,这个过程在运行时可能会反复地执行,所以效率较低
  • 2.C和C++语言在执行过程中,只需要将源代码编译成可执行文件,就包含了计算机能识别的机器码,无需在运行过程中再实时地解释,所以性能较高
  • 3.Java为什么要选择一条执行效率比较低的方式呢?主要是为了实现跨平台的特性。Java的字节码指令,如果希望在不同平台(操作系统+硬件架构),比如在windows或者linux上运行。可以使用同一份字节码指令,交给windows和linux上的Java虚拟机进行解释,这样就可以获得不同平台上的机器码了。这样就实现了Write Once,Run Anywhere 编写一次,到处运行 的目标
  • 4.但是C/C++语言,如果要让程序在不同平台上运行,就需要将一份源代码在不同平台上分别进行编译,相对来说比较麻烦

10.JVM的整体架构(面试):

10.1.整体架构概述:

  • 1.HotSpot VM是目前市面上高性能虚拟机的代表作之一,它采用解释器即时编译器并存的架构,Java程序的运行性能已经达到了可以和C/C++程序一较高下的地步;HotSpot VM的整体结构如下图:
  • 2.在众多的线程中,方法区和堆是多个线程共享的,对于java栈,本地方法栈,程序计数器是每个线程独享的
  • 3.执行引擎包括:解释器、JIT及时编译器,和垃圾回收器

10.2.内存结构详细图:

class文件(字节码文件)生成之后,后面的操作就需要jvm来负责了,首先通过类加载子系统将字节码文件进行加载,然后对应到内存中,生成Class的对象,然后在方法区中对一些静态变量进行初始化等操作,然后再到执行引擎中执行具体的字节码指令,在逐步执行指令的时候,会使用虚拟机栈、程序计数器、堆、本地方法栈等

  • 1.注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有
  • 2.如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?
    • 类加载器
    • 执行引擎

10.3.各个组成部分的介绍:

  • 类加载子系统:核心组件类加载器,负责将字节码文件中的内容加载到内存中。
  • 运行时数据区:JVM管理的内存,创建出来的对象、类的信息等等内容都会放在这块区域中。
  • 执行引擎:包含了即时编译器、解释器、垃圾回收器,执行引擎使用解释器将字节码指令解释成机器码,使用即时编译器优化性能,使用垃圾回收器回收不再使用的对象。
  • 本地接口:调用本地使用C/C++编译好的方法,本地方法在Java中声明时,都会带上native关键字,如下图所示

11.JVM的生命周期(面试)

11.1.虚拟机的启动:

  • 1.Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的

11.2.虚拟机的执行

  • 1.一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
  • 2.程序开始执行时他才运行,程序结束时他就停止
  • 3.执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程

11.3.虚拟机的退出:

  • 1.程序正常执行结束
  • 2.程序在执行过程中遇到了异常或错误而异常终止
  • 3.由于操作系统用现错误而导致Java虚拟机进程终止
  • 4.某线程调用Runtime类或system类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
  • 5.除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。

相关推荐
东阳马生架构5 小时前
JVM实战—1.Java代码的运行原理
jvm
ThisIsClark8 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
王佑辉8 小时前
【jvm】内存泄漏与内存溢出的区别
jvm
大G哥10 小时前
深入理解.NET内存回收机制
jvm·.net
泰勒今天不想展开10 小时前
jvm接入prometheus监控
jvm·windows·prometheus
东阳马生架构1 天前
JVM简介—3.JVM的执行子系统
jvm
程序员志哥2 天前
JVM系列(十三) -常用调优工具介绍
jvm
后台技术汇2 天前
JavaAgent技术应用和原理:JVM持久化监控
jvm
程序员志哥2 天前
JVM系列(十二) -常用调优命令汇总
jvm