一篇文章吃透整个JVM,JVM超详细笔记

这里写目录标题

  • JVM
    • JVM执行流程
      • JVM执行流程
    • JVM内存模型
      • 1.堆区(Heap)
      • 2.虚拟机栈(JVM Stacks)
      • 3.本地方法栈(Native Method Stacks)
      • 4.程序计数器(Program Counter Register)
      • 5.方法区/元数据区(Metaspace)
    • 类加载
      • 1.加载
      • 2. 验证
      • 3.准备
      • 4.解析
      • 5.初始化
    • 双亲委派模型
      • 1.什么是双亲委派模型?**
      • 2.JVM中内置的三个类加载器:
      • 3.具体流程:
    • GC(垃圾回收)
      • 1.什么是垃圾回收机制?
      • 2.垃圾对象判断算法
        • a)引用计数算法
        • b)可达性分析算法
      • 3.垃圾回收算法
        • a)标记清除算法
        • b)复制算法
        • c)标记整理算法
        • d)分治回收算法

JVM

JVM执行流程

JVM执行流程

首先计算机只能认识010101010之类的二进制数据,我们编写的java文件计算机无法直接识别,相关的文件只有我们人能够读懂,但计算机却不行,于是我们就需要将java文件编译为二进制文件来供计算机识别并执行。
于是就有如下执行流程:

程序在执行之前先要把java代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方式,类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) ,而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器,执行引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能,这就是这4个主要组成部分的职责与功能

JVM内存模型

JVM其实是一个java进程,当java进程启动时会从操作系统这里申请一大块区域,以供后续java进程运行的使用,这块区域可以被分为如下5大部分:
在这里插入图片描述

1.堆区(Heap)

这里的堆不同于数据结构中的堆~

  • 堆区存储的数据线程共享
  • 堆区作用:程序中创建的所有对象都在保存在堆中,主要储存成员变量
  • 堆区可以划分为两个区域:新生代和老年代,下文的垃圾回收机制会讲到

2.虚拟机栈(JVM Stacks)

  • 栈区存储的数据线程私有
  • 堆区作用:描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。常说的栈内存指的就是虚拟机栈。
  • 虚拟机栈生命周期和线程相同

3.本地方法栈(Native Method Stacks)

  • 本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用
    的。

4.程序计数器(Program Counter Register)

  • 线程私有
  • 用途是记录当前的程序执行到哪条指令了,利用简单的 long 类型的变量存了一个内存地址,这个内存地址就是下一个要执行的字节码所在的地址~

5.方法区/元数据区(Metaspace)

  • 方法区数据内容 线程共享
  • 作用:放的是类加载之后的类对象(.class文件)以及静态变量

类加载

类加载是指:把.class文件,加载到内存,得到 类对象 这样的过程
Java作为面向对象编程的一门语言,类加载的过程与我们是最密不可分的,一个类的生命周期大概有如下:在这里插入图片描述
而类加载的过程就是上图:加载、验证、准备、解析、初始化

1.加载

  • 找到.class文件,并且读文件内容(双亲委派模型,下文解释~)

2. 验证

  • .class 文件有明确的数据格式,源代码中类的信息都在这里面表现出来,为确保Class文件的字节 流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。

3.准备

  • 给类对象分配初始空间(未初始化的空间,内存空间中的数据全是0)

4.解析

  • 针对 字符串常量 进行初始化:将常量池的符号引用替换为直接引用(字符串常量只知道彼此之间的相对位置,不知道自己在内存中的实际地址,从相对地址转为特定地址的过程)

5.初始化

  • 针对类对象进行初始化,初始化静态成员、静态代码、要是有父类还得加载父类~

双亲委派模型

双亲委派模型主要存在于类加载的加载过程中,他需要用到一组特殊的模块,类加载器。

1.什么是双亲委派模型?**

  • 双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父 类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启 动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类) 时,子加载器才会尝试自己去完成加载。

2.JVM中内置的三个类加载器:

  • BootStrap ClassLoader负责加载 Java 标准库中的类
  • Extension ClassLoader负责加载一些非标准的但是 Sun/Oracle 扩展的库的类
  • Application ClassLoader 负责加载项目中自己写的类 以及 第三方库 中的类~

3.具体流程:

  • Bootstrap 没有父亲类加载器了,因此就只能自己来搜索自己负责的片区~ 如果搜索到,就直接进行后续加载步骤如果没搜索到,再交给孩子来处理~~~~
  • Extension 收到了父亲的反馈,自己来找~ 如果搜索自己负责的片区,找到了,直接进行后续加载步骤~ 如果没搜索到,再交给孩子处理~~~~
  • Application 收到了父亲的反馈,自己来找如果搜索自己负责的片区,找到了,直接进行后续加载步骤如果没找到,也是交给孩子处理,没有孩子了,就抛出一个 ClassNotFoundException

GC(垃圾回收)

1.什么是垃圾回收机制?

  • GC:帮助程序员自动释放内存的
  • 释放时机:较为模糊,只有彻底不使用了才能释放
  • 释放的主要目标区域:堆区
  • 主要流程:垃圾对象判断 + 垃圾对象释放

2.垃圾对象判断算法

a)引用计数算法
  • 基本思想:对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任
    何时刻计数器为0的对象就是不能再被使用的,即对象已"死"。
  • 引用计数法实现简单,判定效率也比较高,Python语言就采用引用计数法进行内存管理。
  • 缺陷1:浪费内存空间~
  • 缺陷2:存在循环引用的问题
b)可达性分析算法
  • 基本思想:把对象之间的引用关系,理解成了一个树形结构.从一些特殊的起点出发,进行遍历只要能遍历访问到的对象,就是"可达"再把"不可达的"当做垃圾即可,Java采用了这种算法~
  • 缺陷1:消耗更多的时间,因此某个对象成了垃圾,也不一定能第一时间发现,因为扫描的过程,需要消耗时间的
  • 缺陷2:在进行可达性分析的时候,要顺藤摸瓜,一旦这个过程中,当前代码中的对象的引用关系发生变化了,为了保证准确完成这个过程,需要让其他业务暂停工作(STW问题)

3.垃圾回收算法

a)标记清除算法
  • 基本思想:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
  • 不足1:效率问题 : 标记和清除这两个过程的效率都不高
  • 不足2:空间问题 : 标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行中
    需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾收集。
b)复制算法
  • 基本思想:把整个内存区域分为两半,一次只用一半,把不是垃圾的对象,拷贝到另一边,然后统一释放整个区域
  • 不足1:内存利用率比较低
  • 不足2:如果当前的对象大部分都是要保留的,垃圾很少,此时复制成本就比较高~~
c)标记整理算法
  • 基本思想:标记过程仍与"标记-清除"过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
  • 不足:搬运开销还是大~
d)分治回收算法
  • 基本思想:一般是把Java堆分为新生代(新生代又分为伊甸区、生存区)和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。
  • 1.新创建的对象,放到伊甸区.当垃圾回收扫描到伊甸区之后,绝大部分对象都会在第一轮 GC 中就被干掉~大部分对象是活不过一岁的(经验规律)
  • 2.如果伊甸区的对象, 熬过第一轮 GC, 就会通过复制算法, 拷贝到生存区,生存区分成两半(大小均等),一次只使用其中一半~~垃圾回收扫描伊甸区的对象,也是发现垃圾就淘汰,不是垃圾的,通过复制算法, 复制到生存区的另外一半
  • 3.当这个对象在生存区, 熬过若干轮 GC 之后,年龄增长到一定程度了就会通过复制算法拷贝到老年代
  • 4.进入老年代的对象,年龄都挺大了,再消亡的概率比前面新生代中的对象小不少,针对老年代的 GC 的扫描频次就会降低很多
    如果老年代中发现某个对象是垃圾了,使用标记整理的方式清除~
  • 5.特殊情况: 如果对象非常大,直接进入老年代 (大对象进行复制算法,成本比较高,而且大对象也不会很多…)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 -- Octave基本操作

场景 Octave语言是一种高级数值计算和数据可视化的开源软件。它提供了一种方便的方式来执行数值计算、数据分析和可视化,特别是在科学和工程领域中。今天学习了一下Octave的基本操作,记录一下。 下载 去Octave官网下载即可。octave下载可自行下载。 …

学习人工智能:Sora技术报告Video generation models as world simulators,2024.2

原文链接: Video generation models as world simulators (openai.com) 摘要: 我们探索了在视频数据上大规模训练生成模型。具体来说,我们在可变片长、分辨率和纵横比的视频和图像上联合训练文本条件扩散模型text-conditional diffusion mo…

案例介绍:信息抽取技术在汽车销售与分销策略中的应用与实践

一、引言 在当今竞争激烈的汽车制造业中,成功的销售策略、市场营销和分销网络的构建是确保品牌立足市场的关键。作为一名经验丰富的项目经理,我曾领导一个专注于汽车销售和分销的项目,该项目深入挖掘市场数据,运用先进的信息抽取…

【Mybatis】快速入门 基本使用 第一期

文章目录 Mybatis是什么?一、快速入门(基于Mybatis3方式)二、MyBatis基本使用2.1 向SQL语句传参2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入2.2.1 Mybatis总体机制概括2.2.2 概念说明2.2.3 单个简单类型参数2.2.4 实体…

租房招聘平台新篇章:Java+SpringBoot技术革新

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

【iOS ARKit】协作Session

使用 ARWorldMap,能解决使用者再次进入同一物理空间时的AR 场景恢复问题,也能在多人之间共桌AR 体验,但这种共享并不是实时的,在载入ARWorldMap 后,设备新检测到的环境信息和使用者所做操作不会实时共享,即…

Avalonia学习(二十八)-OpenGL

Avalonia已经继承了opengl,详细的大家可以自己查阅。Avalonia里面启用opengl继承OpenGlControlBase类就可以了。有三个方法。分别是初始化、绘制、释放。 这里把官方源码的例子扒出来给大家看一下。源码在我以前发布的单组件里面。地址在前面的界面总结博文里面。 …

使用 MinIO 对象存储,创建一个类似网盘的应用

Linux 的 MinIO 对象存储 MinIO 介绍 MinIO 是一个对象存储解决方案,提供与 Amazon Web Services S3 兼容的 API,并支持所有核心 S3 功能。MinIO 可以部署在任何地方。 Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供…

HarmonyOS云端一体化组件之AGC应用管理

(可选)在AGC控制台创建同包名应用 如创建工程时,发现尚未在AGC控制台创建与工程包名相同的应用,可进行补充创建。 1.点击界面提示内的“AppGallery Connect”,浏览器打开AGC控制台“我的项目”页面。 2.点击选择您希…

springboot239华府便利店信息管理系统

华府便利店信息管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本华府便利店信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在…

非阻塞IO:提高应用程序的效率与性能

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

项目可行性方案:人脸识别实现无感考勤的项目技术可行性方案

目 录 1.引言 1.1编写目的 1.2背景 2.可行性研究的前提 2.1要求 2.2目标 3.对现有系统的分析 3.1系统改进示意图 3.2改进之处 3.3技术条件方面的可行性 4.结论 1.引言 1.1编写目的 本报告编写的目的是探究学校里对教室和办公室内教师的人脸进行识别从而…

【复现】宏景HCM 任意文件读取漏洞_63

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 宏景HCM 将人才标签技术应用于员工招聘、人才选拔等环节,通过多维度的标签体系,形成不同专业序列的人才画…

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述:php没有难题 考点总结:脑洞题目,不如我出(狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候,提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …

《幻兽帕鲁》游戏对服务器性能的具体要求是什么?

《幻兽帕鲁》游戏对服务器性能的具体要求是什么? CPU:官方最低要求为i5-3570K,但在多人游玩时可能会有明显卡顿。此外,还有建议选择4核或更高性能的处理器,以确保游戏运行流畅。 内存:对于不同人数的联机&…

代码随想录day10(2)字符串:反转字符串Ⅱ (leetcode541)

题目要求:给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前…

Linux:线程的概念

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上,线程是比进程更轻量级的一种指向流 或 线程是在…

奔跑吧,前端er!前端五大方向技能罗列,webGL、AI、桌面、游戏

经常看到头条上前端们争论各种框架的优劣,然后相互争吵不休,其实技术也好,框架也好,都是服务于项目需求的,争论的铁子们都站在自己的项目角度来品评工具,肯定是公说公有理婆说婆有理啦。 技术和框架是中性的…

异常检测之MemSeg

异常检测之MemSeg MemSeg: A semi-supervised method for image surface defect detection using differences and commonalities 论文链接:https://arxiv.org/abs/2205.00908论文开源代码:https://github.com/TooTouch/MemSeg或https://download.csdn…

【代码】Android|判断asserts下的文件存在与否,以及普通文件存在与否

作者版本:Android 11及以上 主要是发现网上没有完整的、能跑的代码,不知道怎么回事,GPT给我重写的。我只能保证这个代码尊嘟能跑,不像其他的缺胳膊少腿的。 asserts 贴一下结果: boolean isAssertFileExists(String …