JVM知识点大全(未完...)

JVM运行时数据区域


  1. 堆是Java虚拟机中用于存储对象的主要区域,包括字符串常量池。绝大多数对象都是在堆中创建的(少部分对象可能会在栈上分配)。为了更好地进行垃圾回收,堆被划分为年轻代和老年代两部分。年轻代又被进一步分为Eden区和两个Survivor区。

  2. 元空间
    元空间使用直接内存,主要用于存储运行时常量池、类的Class对象实例(包含对象在堆的引用)、JIT编译后的代码缓存、类信息、方法信息、字段信息,以及类加载器的引用等。注意:类变量移动到了堆中,与Class对象在一起

  3. 直接内存
    直接内存可以减少在堆外内存和堆内内存之间的数据复制。如果没有直接内存,Java读取网络数据时,数据会经过内核缓冲区、堆外内存到达堆内内存。有了直接内存,Java可以使用Native函数库直接分配堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象来引用并操作这块内存。

  4. 虚拟机栈
    虚拟机栈是线程私有的,由栈帧组成,负责Java方法调用。每个栈帧包含局部变量表、操作数栈、动态链接以及方法返回地址。动态链接指的是该栈帧执行的运行时常量池中方法的引用。局部变量表主要存储方法参数和局部变量以及对象引用。操作数栈用于存放计算过程中产生的中间结果。虚拟机栈可能会抛出StackOverflowErrorOutOfMemoryError(如果栈允许动态分配内存,动态分配时内存不够则会发生此错误)。

  5. 本地方法栈
    本地方法栈与虚拟机栈类似,但专门用于调用本地方法。

  6. 程序计数器
    程序计数器指向下一条需要执行的字节码指令,是唯一一个不会出现OutOfMemoryError的内存区域。

垃圾回收之后,对象如何从年轻代进入老年代

一般情况下,对象会首先在Eden区分配(大对象直接分配到老年代)。当年轻代的Eden区满时,会触发初次垃圾回收。这个过程中,垃圾回收器(GC)会标记所有存活的对象,并清除未被引用的对象,以释放出空间。这一过程通常被称为“Minor GC”。

存活的对象会被移动到两个Survivor区中的一个,例如S0或S1。在后续的每次垃圾回收中,存活的对象会从Eden区和其中一个Survivor区(例如S0)复制到另一个Survivor区(例如S1),然后将S0保留为空,供下次GC时进一步对象的复制使用。

每经历一次垃圾回收,对象的存活年龄会增加。在垃圾回收过程中,JVM会根据对象的年龄和其占用内存的大小进行统计和累加。当累加到某个年龄时,如果所占用的总大小超过了某个Survivor区的一半(每次垃圾回收都会将存活对象全部移动到其中一个Survivor区,如果对象的大小超过一个Survivor区的总大小,则无法放下),那么这个年龄和对象的累加年龄取最小值,将作为新的晋升年龄阈值。

类加载过程

类加载过程包括 加载、链接和初始化 三个阶段:

  1. 加载
    在加载阶段,Java虚拟机将类的字节码加载到方法区,并根据该字节码代表的静态结构转换为在方法区的运行时数据结构,通常称为 Klass 类(大写的K),这是C++常用的表示方法。Klass内部存储了各种类元信息,随后在堆上生成一个代表该类的 Class 对象(这是一个Java对象),二者通过引用相互持有。

  2. 链接
    链接阶段包括以下三个部分:

    • 验证
      验证是链接的第一步,确保Class文件的字节流中包含的信息符合Java虚拟机规范的所有要求。

    • 准备
      在准备阶段,为 static 变量分配空间,同时设置默认值。例如:

      static int a; // 仅分配空间,不会赋值
      static int b = 9; // 也不会赋值
      

      但是,对于 static final基本类型 以及 字符串常量,赋值会在准备阶段完成。例如:

      static final int a = 12; // 在准备阶段赋值
      static final String b = "aaa"; // 在准备阶段赋值
      

      若是引用类型,如:

      static final Object o = new Object(); // 会在初始化阶段赋值
      
    • 解析
      解析是将常量池内的符号引用替换为直接引用的过程。比如,将静态方法的符号引用替换为指向数据实际存储内存的指针或句柄等(即直接引用),符号引用类似于方法名。这一过程被称为 静态链接(在类加载过程中完成),而 动态链接 则是在程序运行期间完成的,将符号引用替换为直接引用。

  3. 初始化
    初始化阶段对类的静态变量进行初始化为指定的值,并执行静态代码块。

CMS详解

想要详细了解CMS(并发标记清除收集器),必须先了解三色标记。三色标记算法是在对GC Roots可达性分析遍历对象的过程中,将遇到的对象按照“是否访问过”标记成以下三种颜色:

  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代表已经扫描过,是安全存活的。
  • 灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过。
  • 白色:表示对象尚未被垃圾收集器访问过。在可达性分析刚开始时,所有的对象都是白色的;若在分析结束时仍然是白色的对象,则代表不可达。

CMS的回收过程以获取最短回收停顿时间为目标,使用标记-清除算法,整个回收过程分为以下四个步骤:

  1. 初始标记

    • 依靠安全点暂停所有其他线程(STW),并记录下GC Roots直接能引用的对象,速度很快。因此,一般来说,这一步完成后,GC Roots会变为黑色,因为扫描了每个GC Root的所有直接引用。这些直接引用的对象可能是灰色(还引用了其他对象)或黑色(没有其它引用了)。
    • 安全点:程序只有在安全点才会进行GC。JVM依靠抢占式中断实现,不直接操作线程中断,而是简单地设置一个标志,让各个线程在下一个安全点处检测到该标志后,发现标志位为真时就自己中断挂起。安全点通常是在循环的末尾、方法返回前、调用方法后等。
  2. 并发标记

    • 并发标记阶段是从GC Roots的直接关联对象开始遍历整个对象图的过程。这个过程耗时较长,但不需要停顿用户线程,可以与垃圾收集线程并发运行。由于用户程序继续运行,可能会导致已经标记对象的状态发生改变,出现漏标和多标的情况。
    • 多标可以接受,本来是垃圾但本次GC没有被回收;而漏标是不可以接受的,本来不是垃圾却被回收了。漏标要发生,需要满足以下两个条件:
      1. 有至少一个黑色对象在自己被标记后指向了这个白色对象。
      2. 所有的灰色对象在引用扫描完成之前删除了对白色对象的引用。

    网上看到一张图可以帮助理解:
    D是黑色,说明其及其所有直接引用已经扫描完,所以不可能在检查它的新引用G了,而在没检查E的全部引用之前,E将对G的引用断开了

    漏标的解决方案:

    • CMS是写屏障+增量更新。
    • G1是写屏障+原始快照。

    增量更新指的是当黑色对象插入新的指向白色对象的引用关系时,就会将这个新插入的引用记录到一个集合中,等并发扫描结束后,再处理这个集合中的引用关系。而对引用关系的记录是依靠写后屏障实现的。

    原始快照的方式是在灰色对象要删除指向白色对象的引用关系时,将要删除的引用记录到一个集合中,等并发扫描结束后再处理该集合中的引用关系。对引用关系的记录是依靠写前屏障实现的。

  3. 重新标记

    • 重新标记阶段是为了修正并发标记期间因用户程序继续运行而导致标记变化的对象标记记录(主要处理漏标问题)。这个阶段的停顿时间一般会比初始标记稍长,远远比并发标记阶段的时间短,主要依靠三色标记中的增量更新算法。
  4. 并发清理

    • 开启用户线程的同时,GC线程开始对未标记的区域进行清扫。此阶段如果有新增对象,会被标记为黑色,不做任何处理。在此阶段不会出现新的引用指向白色对象的情况,例如:A a = new A(); a = null; 上面的new A()对象已经无法再引用到了。
  5. 并发重置

    • 重置本次GC过程中的标记数据。

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

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

相关文章

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…

Java - SpringBoot之logback设置日期分割并设置指定时间自动清除,Linux启动运行

一、SpringBoot之logback-spring.xml配置 在Spring Boot中,要设置日志按照日期进行分割输出,并设置日志文件的大小自动清除,可以使用logback日志框架的配置 1、创建文件 在项目的resources目录下,创建logback-spring.xml文件 …

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】,提供一个MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为UKF) 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程:使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤,这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口,完全找不到可供参考的例子。如果不需要传递什么参数,就能获取到结果&#xff0c…

基于SpringBoot的“在线考试系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线考试系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 用户注册界面图 管…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

科大讯飞面经,蛮简单的

先来看面经: 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍,这个如果还不会或者还没有准备,请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一,如果自我介绍都不会说,你如何卖个好价…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接:https://arxiv.org/pdf/2411.00776 项目链接:https://yucornetto.github.io/projects/rar.html 代码&模型链接:https://github.com/bytedance/1d-tokenizer 亮点直击 RAR(随机排列自回归训练策略)&#x…

通义千问API调用测试 (colab-python,vue)

文章目录 代码(来自官网)colab中用python测试Qwen2.5在官网上查看并确定过期时间这里看到我的免费额度到25年5月在同一个页面,点击API示例 前端调用直接在前端调用的优缺点以vue为例(代码是基于官网node.js的代码转换而来&#xf…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要,尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据(如体积数据、点云、纹理等)相结合,仓库机器人可以在错综复杂环境中实现自主导航,物品检测…

LSTM+LightGBM+Catboost的stacking融合模型

基本介绍 针对目前大部分数据同时具有特征连续和特征不连续的特点,将神经网络模型如LSTM和回归树模型如XGboost,基于stacking集成学习原理进行融合 附有模型评价指标R2、RMSE、MAE、MSE,代码包含注释,可以直接运行。 融合过程 在机器学习中…

人工智能 | 文生视频大模型

简介 文生视频指的是将文本描述转化为视频内容的技术,2024年2月15日 OpenAI 正式对外发布 Sora 人工智能模型,在人工智能领域掀起了一场风波,这是计算机视觉领域的一个突破。 Sora 这一名称起源于日文中“空”的含义,暗示了其具…

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果,包含不同风格和用途,可在两个剪辑之间创造平滑、自然的转场,用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示: 点击下…

Jest项目实战(7):部署文档网站到 GitHub Pages

关于部署网站,理论上来讲,只要你有一个服务器,你要采用什么样的方式来部署都是可以的。但是前提是你需要有一个服务器(物理机、云服务器)。 这一小节我们部署文档网站选择使用 github 来进行部署,因为 Git…

第十九周:机器学习

目录 摘要 Abstract 一、吴恩达机器学习Exp1——线性回归 1、单变量线性回归 1.1数据集的读取及可视化 1.2分割训练集和验证集 1.3扩展维度 1.4线性回归模型 1.5训练过程可视化 2、多变量线性回归 2.1加载数据集并可视化 2.2划分训练集和验证集 2.3线性回归模型 …

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中,如何延长电池的使用寿命是大家非常关心的问题,而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池,因此长时间的充电与长时间放点都不可取,但是在日常的使用过程中…