JVM介绍

server/2024/12/22 23:47:49/

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虚拟机的退出情况。


http://www.ppmy.cn/server/109554.html

相关文章

数组、向量与矩阵

问题缘起 在看《矩阵力量》的时候,写到 利用 a numpy.array([4,3]). 严格说,此代码产生的不是行向量,运行 a.ndim 发现 a 只有一个维度。因此,转置 numpy.array([4,3]).T 得到的仍然是一维数组,只不过默认展示方式为…

CSS溢出——WEB开发系列20

在网页设计中,“溢出”是一个常见且重要的概念。它涉及到如何处理那些超出预定范围的内容,以确保网页的布局和视觉效果达到预期。 一、什么是溢出? 在 CSS 中,“溢出”(overflow)指的是内容超出其包含块的…

2 Python开发工具:PyCharm的安装和使用

本文是 Python 系列教程第 2 篇,完整系列请查看 Python 专栏。 1 安装 官网下载地址https://www.jetbrains.com.cn/pycharm/,文件比较大(约861MB)请耐心等待 双击exe安装 安装成功后会有一个30天的试用期。。。本来想放鸡火教程&…

Unity 3D学习资料集合

本文包含了unity3D 游戏开发相关的学习资料,包含了入门、进阶、性能优化、面试和书籍等学习资料,含金量非常高,在这里分享给大家,欢迎收藏。 学习社区 1.Unity3D开发者 Unity3D开发者论坛是一个专注于Unity引擎的开发者社区。在这…

【Linux】GDB调试(第七篇)

目录 1.概述 2.调试器的种类 3.GDB的调试命令 4.多线程调试 4.1断点锁定某个线程 5.GDB一些小技巧 6.GDB的底层原理 1.概述 gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你…

set与map

1,介绍 ES6提新的数据结构。set它类似于数组,值都是唯一的,本身是一个构造函数。 map数据结构 它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类 型的值(包括对象&#x…

LeetCode - 9 回文数

题目来源 9. 回文数 - 力扣(LeetCode) 题目描述 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左&…

深入理解归并排序

目录 一、概念 二、递归版实现 三、非递归实现 三、文件归并排序 小结 一、概念 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将…