当前位置: 首页 > news >正文

【JVM系列】- 启航·JVM概论学习

启航·JVM概论

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 博客首页   @怒放吧德德  To记录领地
🌝分享学习心得,欢迎指正,大家一起学习成长!

在这里插入图片描述

文章目录

  • 启航·JVM概论
    • 前言
    • 虚拟机和Java虚拟机
      • 1 虚拟机
      • 2 Java虚拟机
      • 3 JVM的位置
      • 4 *JVM的整体结构
        • 1) 简单介绍HotSpot VM
        • 2) 整体结构介绍
      • 5 Java代码执行流程
      • 6 JVM的生命周期
        • 虚拟机启动
        • 虚拟机执行
        • 虚拟机退出
      • 7 常见虚拟机
    • 总结

前言

为什么要学习JVM?相信好多开发者开头也处于迷惑之中,对于Java虚拟机也是很头疼,大多开发者都会认为,学习JVM无非就是面试。然而,学习JVM并不是为了面试,更是为了深入去理解Java这门语言,笔者大学毕业入坑Java以来也有一年多了,说长也不长,但是在开发的过程中却也是遇到一些性能问题,最后也是由领导解决。个人认为,学习Java虚拟机更是一种基础知识,在开发中才能够深入理解一些细节。

虚拟机和Java虚拟机

1 虚拟机

虚拟机(Virtual Machine)是一种软件或硬件实体,它模拟了物理计算机的功能,允许在其上运行操作系统和应用程序。虚拟机通常用于隔离不同的计算环境,提供了一种独立于物理硬件的计算平台。

2 Java虚拟机

Java虚拟机(Java Virtual Machine,JVM)是一种软件虚拟机,特别为执行Java程序而设计。JVM是Java平台的核心组件之一,它负责将Java字节码翻译成可以在特定计算机上运行的本地机器代码。Java程序员编写的Java代码首先被编译成字节码,然后由JVM执行。这种方式使Java程序具有跨平台的特性,因为只需要在不同平台上实现JVM,就可以在各种操作系统上运行相同的Java程序。

JVM的主要任务包括字节码加载、解释执行或即时编译、垃圾回收、内存管理等。它还提供了各种标准库和API,用于支持Java程序的运行和互动。不同的Java虚拟机实现可以适应不同的硬件和操作系统,但它们都遵循Java虚拟机规范(Java Virtual Machine Specification),以确保Java程序的跨平台性。

3 JVM的位置

Java虚拟机试运行在操作系统之上的,和硬件是没有直接交互的。
在Java 生态系统中的三个关键组件:JDK(Java Development Kit)、JRE(Java Runtime Environment)和 JVM(Java Virtual Machine)
① JDK(Java Development Kit)

JDK是用于Java应用程序的开发工具包。它包括Java编译器(javac)、Java虚拟机(JVM),以及各种开发工具和库,如调试器、性能分析工具、API文档生成工具等。JDK是开发人员用于创建、编译和调试Java应用程序的关键工具,它使开发者能够编写Java源代码并将其编译成Java字节码。JDK的结构包括bin目录,其中包含编译器和其他命令行工具,以及lib目录,其中包含Java类库和运行时支持。

② JRE(Java Runtime Environment)

JRE是用于运行Java应用程序的运行时环境。它包括Java虚拟机(JVM)和Java类库(Java API),允许用户执行已编译的Java应用程序,而不需要进行开发。JRE没有开发工具,因此不包含编译器或其他开发相关的工具。JRE的结构包括bin目录,其中包含用于运行Java应用程序的JVM可执行文件,以及lib目录,其中包含Java类库

三者中,JDK 包含 JRE,而 JRE 包含 JVM。JDK 提供了完整的 Java 开发和运行时环境,适用于开发人员,而 JRE 提供了用于运行 Java 应用程序的环境,适用于普通用户或生产环境。 JVM 是在 JDK 和 JRE 中共享的核心组件,负责执行 Java 应用程序。

4 *JVM的整体结构

1) 简单介绍HotSpot VM

HotSpot VM(HotSpot Virtual Machine)是Oracle(以前是Sun Microsystems)开发的 Java 虚拟机的一种实现,它是Java平台上最广泛使用的虚拟机之一。HotSpot VM在性能和可移植性方面表现出色,它是Java应用程序的运行时引擎,负责将Java字节码翻译成本地机器代码并执行程序。

HotSpot VM是Oracle JDK(Java Development Kit)的一部分,也是许多其他Java发行版的基础,包括OpenJDK。由于其卓越的性能和稳定性,HotSpot VM一直是广泛使用的Java虚拟机之一,特别适用于生产环境和要求高性能的Java应用程序。

2) 整体结构介绍

在这里插入图片描述

对于上图,这里简单介绍一下
首先是Java类通过编译成class文件,在用过类加载器加载到内存中。

类加载是Java虚拟机(JVM)的一个关键组件,负责将Java字节码文件加载到内存中并转换为可执行的类。类加载器的主要任务是查找和加载类文件,确保在程序运行时可以访问所需的类。类加载器的工作使Java的动态性成为可能,允许在运行时加载和卸载类。

接着看这个第二层,运行时的数据区,这里包含了方法区、Java栈、本地方法栈、堆、程序计数器

方法区是存储类信息、常量、静态变量以及编译后的字节码的地方,包括类的结构信息、方法和字段描述,以及运行时常量池。
是Java程序中用于存储对象实例的区域。
是每个线程独有的,用于存储方法调用、局部变量以及方法返回值。
本地方法栈与栈类似,但它存储的是Java程序调用本地方法(使用JNI,Java Native Interface)时的信息。
程序计数器是当前线程执行的字节码指令的位置计数器。

总结

方法区和堆:这两个是多线程共享的
Java栈、本地方法栈和程序计数器:这是每个线程都独有一份

最后看第三层,这一层是和操作系统和硬件交互的重要组件。执行引擎,这是Java虚拟机核心组件之一,他是负责执行Java字节码,将Java字节码解释成底层平台的机器码,或者通过即时编译器(Just-In-Time Compiler,JIT)将字节码编译成本地机器代码以提高性能。本地方法接口是Java虚拟机提供的机制,允许Java代码与本地代码(通常是用C或C++编写的)进行交互,在Java中就是呗native修饰的接口方法。本地方法库是包含本地方法的动态链接库(通常是.so文件或.dll文件),用C或C++编写。

5 Java代码执行流程

Java代码的执行流程可以分为一下几个步骤:

  • 编写Java代码:编写一个xxx.java的文件。
  • 编译源代码:使用Java编译器,将Java源文件编译成xx.class的字节码文件(通常是使用javac)。
  • Java虚拟机:在Java虚拟机(JVM)中,其负责加载字节码文件并将其转换为可执行代码。在类加载过程中还有一些操作,类加载、链接、初始化等等。
  • 执行程序:一旦类加载完成并且程序初始化完成,JVM开始执行程序。
  • 运行时垃圾收集:JVM会定期检查不再被引用的对象,并进行垃圾回收以释放内存资源
  • 程序结束:程序执行完main方法或遇到异常时,程序将结束执行。

在这里插入图片描述

6 JVM的生命周期

Java虚拟机的生命周期简单来说就是三个阶段:启动、执行、退出。JVM的生命周期确保了Java程序的安全加载、初始化和执行,以及资源管理和垃圾回收。这一过程是Java跨平台性的关键,因为它将Java程序从特定硬件平台解耦,使其能够在不同操作系统上运行。

虚拟机启动

Java虚拟机在启动的时候是通过类加载器创建一个初始类来完成。在这一阶段,类加载器加载Java字节码文件,并对其进行验证、准备、解析和初始化等操作,接着链接,包括验证类的正确性、为静态变量分配内存和解析符号引用。然后初始化,在这个阶段,JVM执行类的静态初始化代码,初始化静态变量。

虚拟机执行

JVM进入运行阶段,开始执行程序,通常从main方法开始。程序在运行过程中可以加载、链接、初始化其他类,并执行程序逻辑。同时,JVM的垃圾回收器定期检查不再被引用的对象,进行垃圾回收。这个Java程序在Java虚拟机中就是一个进程。

虚拟机退出

在程序执行完成或出现严重错误时,JVM会进入终止阶段,可以执行清理操作。最后,如果某个类不再被引用,并且没有实例存在,JVM可能会进行卸载,释放内存。

7 常见虚拟机

常见的虚拟机,每种的实现通常都是针对不同的需求,比如sun classic vm、exact vm、jrockit、j9等等。以下笔者通过网络查阅到一些的简单介绍。

在Java生态系统中,有几个常见的Java虚拟机(JVM)实现,每个实现通常针对不同的用例和需求。以下是一些常见的JVM实现:

  • Oracle HotSpot JVM:这是Oracle公司的官方JVM实现,广泛用于生产环境。它以高性能和优化而闻名,是许多企业应用程序的首选JVM。
  • OpenJDK:OpenJDK是Oracle的开放源JVM实现,也是许多其他JVM的基础。它提供了Java开发工具和库,并被许多Linux发行版采用作为默认JVM。
  • IBM J9 JVM:IBM的J9虚拟机是WebSphere应用服务器和其他IBM产品的一部分。它专注于嵌入式和企业级应用。
  • Apache Harmony:虽然已经终止,但Apache Harmony曾是一个Apache项目,旨在创建一个免费的、开放源的JVM实现。虽然它不再维护,但它仍然被某些项目和研究用途使用。
  • GraalVM:GraalVM是Oracle开发的一款全栈虚拟机,支持多种语言,包括Java、JavaScript、Python等。它具有高性能和多语言互操作性,适用于各种应用场景。
  • Azul Zing:Azul Zing是专门针对大规模、高性能Java应用程序而设计的JVM。它包括C4垃圾收集器,可显著降低垃圾回收停顿时间。
  • SAP JVM:SAP JVM是针对SAP应用的JVM实现,优化了SAP系统的性能和稳定性。

这些JVM实现在性能、垃圾回收策略、支持的平台和工具等方面存在差异,开发人员可以根据其应用程序的需求选择最适合的JVM。总的来说,Java虚拟机的多样性为Java生态系统的健康发展提供了重要的选择。

总结

本章就是学习一下Java虚拟机的概念,为了对Java虚拟机有个简单的认识。总之我们知道的JVM有许多,但是我们经常遇到的就是 Oracle HotSpot JVM ,Java虚拟机的主要任务包括字节码加载、解释执行或即时编译、垃圾回收、内存管理等。它还提供了各种标准库和API,用于支持Java程序的运行和互动。不同的Java虚拟机实现可以适应不同的硬件和操作系统。

相关文章:

【JVM系列】- 启航·JVM概论学习

启航JVM概论 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正&#xff0c…...

Windows技巧

Windows应用 Windows应用无限延长Windows10 自动更新时间管理员身份打开cmd输入以下代码设置暂停更新时间 Windows应用 无限延长Windows10 自动更新时间 管理员身份打开cmd 输入以下代码 这里设置的是3000天,需要恢复更新可以将其设置为1天 reg add “HKEY_LOCA…...

Git 应用小记

常用命令 git reset 3种模式 --soft:将HEAD引用指向给定提交,索引(暂存区)和工作目录的内容不变 --mixed(默认,可不写):将HEAD引用指向给定提交,索引(暂存区…...

APT攻击与零日漏洞

APT攻击 当谈到网络安全时,APT(高级持续性威胁)攻击是最为复杂和难以检测的攻击类型之一。APT攻击通常涉及到高度的技术和策略性,而且它们的目标是深入地渗透和长时间地隐藏在目标网络中。 1. 什么是APT攻击? 高级持续…...

leetCode 1143.最长公共子序列 动态规划 + 滚动数组

1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串…...

【C++ Miscellany】继承体系非尾端类设计为抽象类

部分赋值问题 用软件来处理两种动物:蜥蜴和鸡 class Animal { public:Animal& operator (const Animal& rhs);... };class Lizard: public Animal { public:Lizard& operator (const Lizard& rhs);... };class Chicken: public Animal {Chicken…...

Leetcode236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...

Swift SwiftUI CoreData 过滤数据 2

预览 Code import SwiftUI import CoreDatastruct HomeSearchView: View {Environment(\.dismiss) var dismissState private var search_value ""FetchRequest(entity: Bill.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Bill.c_at, ascending: false)…...

解决maven骨架加载慢问题(亲测解决)

1、下载archetype-catalog.xml 网站 : https://repo.maven.apache.org/maven2/ 2、放在这个文件夹下面 3、setting–>build–>Runner : -DarchetypeCataloglocal...

Android---java内存模型与线程

Java 内存模型翻译自 Java Memory Model,简称 JMM。它所描述的是多线程并发、CPU 缓存等方面的内容。 在每一个线程中,都会有一块内部的工作内存,这块内存保存了主内存共享数据的拷贝副本。但在 Java 线程中并不存在所谓的工作内存&#xff0…...

23.10.7.sql 里面的DISTINCT

例如: SELECT DISTINCT t.container_no FROM biz_inventory_task_detail t 这里distinct干嘛的 解释: DISTINCT是一个关键字,用于在SELECT语句中返回唯一不重复的值。 在这个查询中,使用DISTINCT关键字,是为了返回biz…...

mysql面试题38:count(1)、count(*) 与 count(列名) 的区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官: count(1)、count(*) 与 count(列名) 的区别 当使用COUNT函数进行数据统计时&…...

nodejs+vue+elementui大学生心理健康管理系统

简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE本大学生心理健康管理系统使用简洁的框架结构,专门用于用户咨询心理专家,系统具有方便性、灵活性、应用性。于是…...

【MySQL】深入解析MySQL双写缓冲区

原创不易,注重版权。转载请注明原作者和原文链接 文章目录 为什么需要Doublewrite BufferDoublewrite Buffer原理Doublewrite Buffer和redo logDoublewrite Buffer相关参数总结 在数据库系统的世界中,保障数据的完整性和稳定性是至关重要的任务。为了实现…...

u-boot 编译与运行

文章目录 u-boot 编译与运行环境配置ubuntu 版本qemu 版本u-boot 版本(master)交叉工具链版本 u-boot 源码下载生成配置文件报错情况一报错情况2 u-boot 配置编译编译脚本编译报错解决编译日志编译产物 运行 u-boot 编译与运行 本文主要介绍 u-boot 编译…...

C++QT-day2

#include <bits/stdc.h>/*自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c;定义公有成员函数:初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h)输出该矩形的周长和面积函数:void sho…...

【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)

题目描述 看本文需要准备的知识 1.最长上升子序列&#xff08;lis&#xff09;的算法思想和算法模板 2.acwing1010拦截导弹&#xff08;lis贪心&#xff09;题解 本题题解&#xff0c;需要知道这种贪心算法 3.简单了解dfs暴力搜索、剪枝、搜索树等概念 思路讲解 dfs求最…...

字节大佬带你五分钟掌握接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。 特别是在…...

上传文件夹里面的文件后,按树结构的table表格展示

1. 先处理最简单的 原始数据大概是这样: let fileArr [{progress: 100,status: 成功,type: 通号,webkitRelativePath: "六捷数据2023-05-04 163909/G163/Abis口详细信息_(G163)(380BL3544-0)(14984173988)(2018-01-24 174431.0740—2018-01-24 180347.9070).xls"…...

【error】root - Exception during pool initialization

报错提示&#xff1a;root - Exception during pool initialization. 错误原因&#xff1a; 配置数据库出错 我的错误配置&#xff1a; spring.datasource.urljdbc:mysql://localhost:3306/springboot?serverTimezoneGMT spring.datasource.nameroot spring.datasource.pass…...

【重拾C语言】九、再论函数(指针、数组、结构体作参数;函数值返回指针、结构体;作用域)

目录 前言 九、再论函数 9.1 参数 9.1.1 参数的传递规则 9.1.2 指针作参数 9.1.3 数组作参数 9.1.4 结构体作参数 a. 直接用结构体变量作函数参数 b. 用指向结构体变量的指针作函数参数 9.2 函数值 9.2.1 返回指针值 9.2.2 返回结构体值 a. 返回结构体值 b. 返回…...

Spring WebClient 基于响应式编程模型的HTTP客户端

一、简介 WebClient是一个非阻塞的、可扩展的、基于Reactive Streams规范的HTTP客户端。它提供了一种简洁的方式来进行HTTP请求&#xff0c;并且可以很好地与其他Spring组件集成。WebClient支持同步和异步操作&#xff0c;使得它非常适合用于构建响应式应用程序。 WebClient允…...

IP真人识别方法与代理IP检测技术

随着互联网的发展&#xff0c;IP地址在网络安全和数据分析中扮演着重要的角色。为了维护网络的安全性和识别真实用户&#xff0c;IP地址的真实性和来源成为了一个关键问题。 什么是IP真人识别&#xff1f; IP真人识别是一种技术&#xff0c;旨在确定IP地址背后的用户是否为真实…...

MySQL 面试知识脑图 初高级知识点

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuid18b10870122586-src&share_type1 sql_mode 基本语法及校验规则 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作&#xff0c;如果在SELECT中的列&#xff0c;没有在GROUP BY中出现&#xff…...

【数据结构】二叉树的链式结构及实现

目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 1. 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二叉树结构…...

OpenCV4(C++)—— 创建窗口滑动条来调参

文章目录 创建滑动条 —— createTrackbar 创建滑动条 —— createTrackbar createTrackbar是OpenCV中的一个函数&#xff0c;用于创建一个可调节的滑动条&#xff08;Trackbar&#xff09;&#xff0c;以便在图像处理过程中实时调整参数 int cv::createTrackbar(const String…...

深度学习基础知识 学习率调度器的用法解析

深度学习基础知识 学习率调度器的用法解析 1、自定义学习率调度器**&#xff1a;**torch.optim.lr_scheduler.LambdaLR2、正儿八经的模型搭建流程以及学习率调度器的使用设置 1、自定义学习率调度器**&#xff1a;**torch.optim.lr_scheduler.LambdaLR 实验代码&#xff1a; i…...

【JUC系列-12】深入理解PriorityQueue的底层原理和基本使用

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…...

Paddle安装

Paddle安装参考 docs/tutorials/INSTALL_cn.md PaddlePaddle/PaddleDetection - Gitee.comhttps://gitee.com/paddlepaddle/PaddleDetection/blob/release/2.6/docs/tutorials/INSTALL_cn.md # 不指定版本安装paddle-gpu python -m pip install paddlepaddle-gpu# 测试安装 …...

配置XP虚拟机和Win 10宿主机互相ping通

文章目录 一、关闭虚机和宿主机的防火墙1、关闭虚拟机的防火墙1.1方式一1.2方式二 2、关闭宿主机的防火墙 二、设置XP和宿主机VMnet8的IP地址、网关和DNS1、获取VMWare的虚拟网络配置信息2、设置XP的VMnet8的IP地址、网关和DNS3、设置宿主机VMnet8的IP地址、网关和DNS 三、获取…...