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 小时前
Java反射原理及其性能优化
jvm·性能优化
AAA 建材批发王哥(天道酬勤)11 小时前
JVM 由多个模块组成,每个模块负责特定的功能
jvm
JavaNice哥17 小时前
1初识别jvm
jvm
涛粒子17 小时前
JVM垃圾回收详解
jvm
YUJIANYUE18 小时前
PHP将指定文件夹下多csv文件[即多表]导入到sqlite单文件
jvm·sqlite·php
逊嘘18 小时前
【Java语言】抽象类与接口
java·开发语言·jvm
鱼跃鹰飞1 天前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
王佑辉1 天前
【jvm】Major GC
jvm
阿维的博客日记1 天前
jvm学习笔记-轻量级锁内存模型
jvm·cas·轻量级锁