关于什么是 JVM

关于什么是 JVM,看看普通⼈和⾼⼿的回答。

普通人

JVM 就是 Java 虚拟机,是⽤来运⾏我们平时所写的 Java 代码的。优点是它会

⾃动进⾏内存管理和垃圾回收,缺点是⼀旦发⽣问题,要是不了解 JVM 的运⾏

机制, 就很难排查出问题所在。

高手

JVM 全称是 Java 虚拟机,在聊什么是 JVM 之前,我们不妨看⼀下这张图。

image-20231129202929721

从这张图中可以看出 JVM 所处的位置,同时也能看出它两个作用:

l 运⾏并管理 Java 源码⽂件所⽣成的 Class⽂件,

l 在不同的操作系统上安装不同的 JVM,从⽽实现了跨平台的保证。

⼀般情况下,对于开发者⽽⾔,即使不熟悉 JVM 的运⾏机制并不影响业务代码的开发,因为在安装完 JDK 或者 JRE 之后,其中就已经内置了 JVM,所以只需要将 Class⽂件交给 JVM 运⾏即可。

但当程序运⾏的过程中出现了问题,⽽这个问题发生在 JVM 层⾯的,那我们就需要熟悉 JVM 的运⾏机制,才能迅速排查并解决 JVM 的性能问题。

我们先看下目前主流的 JVM HotSpot 的架构图,通过这张架构图,我们可以看出 JVM 的大致流程是把一个 class 文件通过类加载器加载进系统,然后放到不同的区域,通过编译器编译。

image-20231129203101403

第一个部分 Class Files

在 Java 中,Class⽂件是由源码⽂件⽣成的,⾄于源码⽂件的内容,是每个 Java开发者在 JavaSE 阶段的必备知识,这⾥就不再赘述了,我们可以关注⼀下 Class⽂件的格式,⽐如其中的常量池、成员变量、⽅法等,这样就能知道 Java 源码内容在 Class⽂件中的表示⽅式

第二个部分 Class Loader Subsystem 即类加载机制

Class⽂件加载到内存中,需要借助 Java 中的类加载机制。类加载机制分为装载、链接和初始化,其主要就是对类进⾏查找、验证以及分配相关的内存空间和赋值

第三个部分 Runtime Data Areas 也就是通常所说的运⾏时数据区

其解决的问题就是 Class⽂件进入内存之后,该如何进⾏存储不同的数据以及数据该如何进⾏扭转。比如:Method Area 通常会储存由 Class⽂件常量池所对应的运⾏时常量池、字段和⽅法的元数据信息、类的模板信息等;Heap 是存储各种 Java 中的对象实例;Java Threads 通过线程以栈的⽅式运⾏加载各个⽅法;Native Internal Thread 可以理解为是加载运⾏native 类型的⽅法;PC Register则是保存每个线程执⾏⽅法的实时地址。

这样通过运⾏时数据区的 5 个部分就能很好地把数据存储和运⾏起来了

第四个部分 Garbage Collector 也就是通常所说的垃圾回收

就是对运⾏时数据区中的数据进⾏管理和回收。回收机制可以基于不同的垃圾收集器,⽐如 Serial、Parallel、CMS、G1、ZGC 等,可以针对不同的业务场景选择不同的收集器,只需要通过 JVM 参数设置 即可。如果我们打开 hotspot 的源码,可以发现这些收集器其实就是对于不同垃圾收集算法的实现,核⼼的算法有3 个:标记-清除、标记-整理、复制

  • 标记-清除:标记-清除算法即先标记处待回收的垃圾对象,然后回收其内存区域。

    这种算法存在两个缺点:一是这回收过程中需要大量标记,清除动作。随着堆中对象数量的增长,执行效率越来越低;二是会产生内存碎片,导致在分配大对象时有可能没有连续的内存,提前触发再一次垃圾回收。

  • 标记-整理:标记-复制算法在对象存活率较高时,就要随之进行更多的复制操作,效率也随之降低。同时如果不想浪费一半的内存空间,就要提供上述的逃生门机制,需要有其他内存空间托底。因此这种算法并不适合对老年代进行回收。

    标记-整理算法通常用来回收老年代,它的过程是这样的:在发生老年代回收时,首先标记存活的对象,然后将存活对象向内存的一端移动,最后清理掉边界以外的内存区域。

  • 标记-复制:标记-复制算法即先将堆划分为两个区域,新建对象时只使用其中一个区域分配内存,发生 GC 时先标记存活的对象,然后将存活的对象复制到另一块空间中,然后再清空之前的空间。

    对象存活的数量较多时,需要做大量的复制操作,将会产生大量的空间复制开销。但是在对象存活数量较少时,只需复制少量的对象,然后一次性清理之前使用的空间。在复制时只需按照顺序分配另一块的内存即可,不会产生内存碎片问题,算法简单高效,标记-复制算法特别适合对于年轻代的垃圾回收

    这种算法最大的缺点显而易见:分配对象时只使用了一半空间,有很严重的空间浪费。

    针对这个问题,其实可以通过调整前后两块内存空间的占比来优化,具体的做法是:在 JVM 中,将堆的空间主要分为两部分,年轻代和老年代,同时对于年轻代又划分为 Eden 区域、From 区域和 To 区域。

    image-20231129204206762

    新建的对象被分配到 Eden Space 中,当 Eden 区域空间满时,就触发一次 Young GC,已经不被使用的做回收处理,而仍然被使用的则被复制到 From 区域。经过这个过程,整个Eden区域就是空闲的,如果有新的对象,就 Eden 区域中创建。如果Eden区域的内存再次被用完,就再一次触发了 Young GC ,这时就将 Eden 区域和 From 区域中还在使用的对象复制到 To 区域。下一次 Young GC 则是将 Eden 区域和 To 区域中还在使用的对象全部复制到 From 区域。

    如此,经过多次 Young GC 后,会存在某些对象在 From 区域和 To 区域进行多次复制,如果超过某个阈值对象仍然没有释放,则将这些对象复制到 Old Generation。如果Old Generation 区域也用完之后,就会触发 Full GC ,全量回收会对系统的性能造成非常大的影响,所以可以根据各应用的特点和对象的生命周期来设置一个合理的年轻代与老年代的大小值,尽量减少 Full GC。

    在 HotSpot 虚拟机中,默认 Eden 和 Survivor(指其中的一块) 的大小比例是 8 :1,即只浪费了 10 % 的空间。当 Survivor 的空间无法存储仍在存活的对象时,会有类似逃生门的机制,直接进入老年代空间。

第五个部分是 JIT Compiler 和 Interpreter

通俗理解就是翻译器,Class 的字节码指令通过 JIT Compiler 和 Interpreter 翻译成对应操作系统的 CPU 指令,只不过可以选择解释执⾏或者编译执⾏,在HotSpot JVM 默认采用的是这两种⽅式的混合。

image-20231129203351511

第六就是 JNI 的技术

如果我们想要找 Java 中的某个 native⽅法是如何通过 C 或者 C++实现的,那么可以通过 Native Method Interface 来进⾏查找,也就是所谓的 JNI 技术。

通过官⽹上给出的 HotSpot 架构图,我们就能够知道 JVM 到底是如何运行的了,当然在实际操作的过程中我们可以借助⼀些 JVM 参数:

image-20231129203511665

和⼀些常⻅的 JDK 常⻅命令

image-20231129203543082

再结合 JDK 常⻅⼯具以及第三⽅的⼀些⼯具

image-20231129203609897

我们就可以优雅地分析 JVM 出现的常⻅问题并对其进⾏调优。

以上就是我对 JVM 的理解。

好的,看完高手的回答后,相信每位看完视频的小伙伴对 JVM 有了更深刻的理解了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/213027.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中GDI+绘图应用(柱形图、折线图和饼形图)

目录 一、柱形图 1.示例源码 2.生成效果 二、折线图 1.示例源码 2.生成效果 三、饼形图 1.示例源码 2.生成效果 GDI绘制的一些常用的图形,其中包括柱形图、折线图和饼形图。 一、柱形图 柱形图也称为条形图,是程序开发中比较常用的一种图表技术…

2024年网络安全行业前景和技术自学

很多人不知道网络安全发展前景好吗?学习网络安全能做什么?今天为大家解答下 先说结论,网络安全的前景必然是超级好的 作为一个有丰富Web安全攻防、渗透领域老工程师,之前也写了不少网络安全技术相关的文章,不少读者朋…

vuepress-----19、自动生成侧边栏

自动生成侧边栏插件 https://github.com/shanyuhai123/vuepress-plugin-auto-sidebar https://shanyuhai123.github.io/vuepress-plugin-auto-sidebar/ 安装 npm i vuepress-plugin-auto-sidebar -Dmodule.exports {plugins: [["vuepress-plugin-auto-sidebar",…

【抽象策略模式】实践

前言 刚果商城,用户登录 Or 注册 发送邮箱验证码场景,使用抽象策略模式实现 什么是抽象策略模式 抽象策略模式是一种行为型设计模式,它允许定义一系列算法,将每个算法封装起来,并使它们可以互相替换。这使得客户端代码…

牛客在线编程(SQL大厂面试真题)

1.各个视频的平均完播率_牛客题霸_牛客网 ROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time d…

NSS [NSSCTF 2022 Spring Recruit]babyphp

NSS [NSSCTF 2022 Spring Recruit]babyphp 考点&#xff1a;PHP特性 开局源码直接裸奔 <?php highlight_file(__FILE__); include_once(flag.php);if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){if(isset($_POST[b1])&&…

【K8s】Kubernetes CRD 介绍(控制器)

文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR&#xff08;Custom Resource&#xff09;其实就是在 Kubernetes 中定义一个自己的资源类型&#xff0c;是一个具…

VMware上不去网

VMwarw上不去网了&#xff0c;之前还好好的&#xff0c;这又是碰了哪里。ifconfig提示no device. 又开始折腾&#xff0c;一顿猛如虎的操作。 先把网络各种禁用&#xff0c;再开启。未解决。 最后的解决了的方案&#xff0c;重新设置了虚拟机的网络。 网络1设置为桥接 网络…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

数据库的索引

索引的特点 1&#xff09;加快查询的速度 2&#xff09;索引自身是一种数据结构&#xff0c;也要占用存储空间 3&#xff09;当我们需要进行增删改的时候&#xff0c;也要对索引进行更新&#xff08;也需要额外的空间开销&#xff09; sql操作 查看索引 show index from …

node后端接口无法插入数据为emoji的表情的问题

原因 emoji的表情一般是这样的\xF0\x9F\x98\x80或者是\xF0\x9F\x98 &#xff0c;事实上 一般数据库的utf8的编码类型都是能保存\xF0\x9F\x98 但是不能保存\xF0\x9F\x98\x80这种样的emoji&#xff0c;要将数据库编码格式为utf8mb4 也就是utf8的超集 另外&#xff0c;除了 数据库…

Java核心知识点整理大全27-笔记(已完结)

目录 30. 云计算 30.1.1. SaaS 30.1.2. PaaS 30.1.3. IaaS 30.1.4. Docker 30.1.4.1. 概念 30.1.4.2. Namespaces 30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离) 30.1.4.4. Libnetwork 与网络隔离 30.1.4.5. 资源隔离与 CGroups 30.1.4.6. 镜像与 UnionFS 30.1.4.7.…

vue+electron问题汇总

1. Vue_Bug Failed to fetch extension, trying 4 more times 描述&#xff1a;项目启动时报错 解决&#xff1a;注释图片中内容 2. Module not found: Error: Can’t resolve ‘fs’ in 描述&#xff1a;项目启动报错 解决&#xff1a;vue.config.js中添加图中数据 3.导入…

学习php中使用composer下载安装firebase/php-jwt 以及调用方法

学习php中使用composer下载安装firebase/php-jwt 以及调用方法 1、安装firebase/php-jwt2、封装jwt类 1、安装firebase/php-jwt composer require firebase/php-jwt安装好以后出现以下文件: 2、封装jwt类 根据所使用的php框架&#xff0c;在指定目录创建 Token.php <?ph…

好莱坞明星识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

clickhouse的向量化执行

背景 clickhouse快的很大一部分原因来源于数据的向量化执行&#xff0c;本文就来看一下向量化执行和正常标量执行的区别 SIMD的向量化执行 从上图可知&#xff0c;clickhouse通过SIMD指令可以做到一个cpu周期操作两个向量的运算操作&#xff0c;比起普通的cpu指令效率提高了N…

Linux库之动态库静态库

一、什么是库&#xff08;Library&#xff09; 二、库的分类 三、静态库、动态库优缺点 四、静态库的制作和使用 五、动态库的制作和使用 SO-NAME–解决主版本号之间的兼容问题 基于符号的版本机制 共享库系统路径 共享库的查找过程 有用的环境变量 gcc 编译器常用选项 Linux共…

八个适合女大学生做的赚钱小副业

大学的生活可以说是多姿多彩&#xff0c;既有沉浸在课堂知识中的学习&#xff0c;也有课余时间可以自由支配的自我发展。然而&#xff0c;作为一名女大学生&#xff0c;除了追求优异的学业表现&#xff0c;是否还有其他更加多元化且有意义的方式来充实自己呢&#xff1f; 当然&…

vue el-select多选封装及使用

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时&#xff0c;也包含了一个el-input组件用于过滤搜索选择项&#xff0c;以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…

linux云服务器开启防火墙注意事件

重要的事情先说三遍: linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! 也就是能打开这个页面: 为什么这么说呢?如果你…