关于什么是 JVM

news2024/11/27 21:55:36

关于什么是 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.coloradmin.cn/o/1295971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网工内推 | 外企、合资公司急招网工,国内外旅游,健身年卡

01 深圳市耐施菲信息科技有限公司 招聘岗位:网络工程师 职责描述: 1、负责项目的计划、实施、过程管控、项目验收等工作; 2、负责大型项目设备实施、安装调试等售后维护工作; 3、分析、设计网络拓扑结构、配置H3C、华为等交换机…

扁平的MutableList元素每隔若干元素一组装入新MutableList,Kotlin

扁平的MutableList元素每隔若干元素一组装入新MutableList&#xff0c;Kotlin fun main(args: Array<String>) {val array arrayOf("a", "b", "c", "d", "e", "f", "g", "h", "i…

Linux设置root初始密码

目录 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; 二、Linux系统中设置root初始密码 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; windows 系统中有普通用户和特权用户&#xff0c;特权用户是 administer&#xff0c;普通用户可以…

Qt练习题

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

个人信息展示网站需求分析报告

目录 一. 概述1.1 设计目的1.2 术语定义 二. 需求分析三. 系统功能需求3.1 功能总览3.2 业务流程图1.系统用例图2.系统流程 四.开发技术4.1 技术组成 五.界面及运行环境1.用户界面2.运行环境 一. 概述 1.1 设计目的 兴趣使然。将知识点综合运用。CSDN有功能限制&#xff0c;因…

【LeetCode】692. 前K个高频单词

692. 前K个高频单词 描述示例解题思路及事项思路一思路二 描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序 示例 示例1 输…

基于YOLOv7算法和Caltech数据集的高精度行人目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法和Caltech数据集的高精度行人目标检测系统可用于日常生活中检测与定位行人目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算…

宁盾统一身份中台助力某集团公司实现统一身份认证和管理(如泛微OA、微软AD)

某集团公司是一家以钢铁为主业&#xff0c;涉足互联网金融、文化健康、智慧城市、现代物流等多领域的大型现代化企业集团。创业发展已有三十余年&#xff0c;拥有员工人数超万人&#xff0c;为了提升管理效率&#xff0c;同时实现国产化创新和数字化转型&#xff0c;公司采用了…

大一python题库及答案,大一python期末必考题

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;大一python题库及答案&#xff0c;大一python期末必考题&#xff0c;今天让我们一起来看看吧&#xff01; 本篇文章给大家谈谈大一python题库及答案&#xff0c;以及大一python期末必考题&#xff0c;希望对各位有所帮助…

排序算法-插入/希尔排序

1 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 1.2直…

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)

Si24R03是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…

12月8日作业

题目&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&am…

【超详细教程】FL Studio 21中文破解版,让你的音乐制作更出彩啦!

嗨小仙女们&#xff01;今天小助理要跟大家分享一个超赞的消息&#xff01;你们知道吗&#xff0c;FL Studio 21中文破解版终于来啦&#xff01; FL Studio 21是一款超级火爆的音乐制作软件&#xff0c;不仅功能强大&#xff0c;而且操作简单&#xff0c;适合各种水平的音乐制…

Python Django-allauth: 构建全面的用户身份验证系统

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Django-allauth是一个功能强大的Django插件&#xff0c;旨在简化和定制Web应用程序中的用户身份验证和管理。本文将深入介绍Django-allauth的核心功能、基本用法以及实际应用场景&#xff0c;通过丰富的示例代码…

【数据结构】插入排序,希尔排序,选择排序,堆排序,冒泡排序

1.插入排序 思路&#xff1a;插入排序将一个数插入一个有序的数组里面&#xff0c;将这个数和数组元素挨着比较&#xff0c;直到他插入到合适的位置。 动画演示&#xff1a; 步骤&#xff1a;1.定义一个变量tmp保存要插入的数据 2.在循环中用tmp和有序数组中的元素比较&#…

SpringBoot Seata 死锁问题排查

现象描述&#xff1a;Spring Boot项目&#xff0c;启动的时候卡住了&#xff0c;一直卡在那里不动&#xff0c;没有报错&#xff0c;也没有日志输出 但是&#xff0c;奇怪的是&#xff0c;本地可以正常启动 好吧&#xff0c;姑且先不深究为什么本地可以启动而部署到服务器上就无…

软件压力测试的重要性与用途

在当今数字化的时代&#xff0c;软件已经成为几乎所有行业不可或缺的一部分。随着软件应用规模的增加和用户数量的上升&#xff0c;软件的性能变得尤为关键。为了确保软件在面对高并发和大负载时仍然能够保持稳定性和可靠性&#xff0c;软件压力测试变得至关重要。下面是软件压…

python 使用 AppiumService 类启动appium server

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。 二、操作步骤 import osfrom appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import pathclass AppiumSer…

Python入门第1篇

前言 很久之前就知道有python这个东西&#xff0c;当时也想的学学&#xff0c;不过一直没做行动派。 那时候就听说用python进行Excel数据分析处理、爬虫等很是厉害&#xff0c;但是始终没有与python的关系更进一步。 Python简介 用我自己的话说&#xff0c;python也是一门面…

【面试经典150 | 二叉树】对称二叉树

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的…