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.mzph.cn/web/58419.shtml

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

相关文章

九宫格按键输入

题目描述 九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入""或者其他字符,则循环中断,输…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

ZISUOJ 2024算法基础公选课练习一(1)

前言、 又是一年算法公选课&#xff0c;与去年不同的是今年学了一些纯C&#xff08;而不是带类的C&#xff09; 一、我的C模板 1.1 模板1 #include <bits/stdc.h> using i64 long long;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);return 0; } 1…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

【机器学习】Lesson 4 - 朴素贝叶斯(NB)文本分类

目录 背景 一、适用数据集 1. 数据集选择 1.1 适用领域 1.2 数据集维度&#xff08;特征数&#xff09; 1.3 数据行数 2. 本文数据集介绍 2.1 数据集特征 2.2 数据格式 3. 数据集下载 二、算法原理 1. 朴素贝叶斯定理 2. 算法逻辑 3. 运行步骤 4. 更多延申模型 …

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

使用Vue3和Vue2进行开发的区别

使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了&#xff0c;但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候&#xff0c;回答的还是有些琐碎&#xff0c;干脆今天专门整理一下&#xff0c;做个记录。 一、再也不用set了 众所…

项目开发流程规范文档

项目开发流程规范文档 目标: 明确项目组中需求管理人员, 交互设计, 美工以及开发之间的工作输入输出产物. 明确各岗位职责. 以免造成开发, 产品经理以及项目经理之间理解不到位, 沟通成本过高,返工造成资源浪费. 所有环节产生的文档都可以作为项目交付的资源. 而不是事后再补文…

在docker里创建 bridge 网络联通不同容器

1.网络创建&#xff1a; docker network create --subnet192.168.1.0/24 --gateway192.168.1.1 uav_management 2.查看网络&#xff1a; docker network ls 3.给已经创建的容器分配ip: docker network connect --ip 192.168.1.10 uav_management 容器名/容器id 示例&#xf…

【极限编程(XP)】

极限编程&#xff08;XP&#xff09;简介 定义与核心价值观&#xff1a;极限编程&#xff08;Extreme Programming&#xff0c;XP&#xff09;是一种轻量级、敏捷的软件开发方法。它强调团队合作、客户参与、持续测试和快速反馈等价值观&#xff0c;旨在提高软件开发的效率和质…

低代码用户中心:简化开发,提升效率的新时代

随着数字化转型的加速&#xff0c;企业对于快速交付高质量应用的需求日益增长。在这个背景下&#xff0c;低代码开发平台应运而生&#xff0c;成为越来越多企业和开发者的首选工具。今天&#xff0c;我们将聚焦于低代码用户中心&#xff0c;探讨其如何帮助开发者简化流程、提升…

Docker在CentOS上的安装与配置

前言 随着云计算和微服务架构的兴起&#xff0c;Docker作为一种轻量级的容器技术&#xff0c;已经成为现代软件开发和运维中的重要工具。本文旨在为初学者提供一份详尽的指南&#xff0c;帮助他们在CentOS系统上安装和配置Docker及相关组件&#xff0c;如Docker Compose和私有…

Redis 权限控制(ACL)|ACL 命令详解、ACL 持久化

官网文档地址&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/ 使用版本&#xff1a;Redis7.4.1 什么是 ACL&#xff1f; ACL&#xff08;Access Control List&#xff09;&#xff0c;权限控制列表&#xff0c;是 Redis 提供的一种…

淘宝反爬虫机制的主要手段有哪些?

淘宝的反爬虫机制主要有以下手段&#xff1a; 一、用户身份识别与验证&#xff1a; User-Agent 识别&#xff1a;通过检测 HTTP 请求头中的 User-Agent 字段来判断请求是否来自合法的浏览器。正常用户使用不同浏览器访问时&#xff0c;User-Agent 会有所不同&#xff0c;而爬虫…

2024最新gewe开发微信机器人教程说明

微信时代&#xff0c;越来越多的业务/服务沟通已直接在微信上完成&#xff0c;但在沟通效率及员工管理方面却存在如下问题&#xff1a; 1、现有的微信功能&#xff0c;已无法满足与客户沟通时的高效率要求 2、当员工掌管的微信号若干或更多时&#xff0c;迫切需要有个汇总工具…

Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展&#xff0c;人们的…

如何使用Langchain集成Kimi AI(Moonshot AI)

如何使用Langchain集成Kimi&#xff08;Moonshot AI&#xff09; 一、获取API密钥1. 注册账号2. 获取密钥 二、环境配置三、上手四、整合一下五、检验一下成果六、官方网站 一、获取API密钥 1. 注册账号 毕竟只有注册过帐号才能拿到key~ Moonshot 登陆 2. 获取密钥 用户中心…

前端开发模板Pear Admin Layui

目录 基本资料学习笔记04-Pear-Admin-Layui模板运行05-Pear-Admin-Layui-GIT方式代...06-Pear-Admin与Vue对比 & 07-Pear-Admin与Vue对比补充09-Pear-Admin-CRUD练习-数据库表创建12-Pear-Admin-CRUD练习-引入其它依赖 & 13-Pear-Admin-CRUD练习-三层架构以及常见配置 …

新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用

一、DAC空气捕集提取CO2的介绍 直接空气碳捕获&#xff08;Direct Air Capture&#xff0c;简称DAC&#xff09;是一种直接从大气中提取二氧化碳的技术。 二、DAC空气捕集提取CO2的前景 从大气中提取的这种二氧化碳可以作为循环经济的一部分以各种不同方式使用。未来&#xf…

uni-app 封装图表功能

文章目录 需求分析1. 秋云 uchars2. Echarts 需求 在 uni-app 中使用图表功能&#xff0c;两种推荐的图表工具 分析 在 Dcloud市场 搜索Echarts关键词&#xff0c;会出现几款图表工具&#xff0c;通过大家的下载量&#xff0c;可以看到秋云这个库是比较受欢迎的&#xff0c;其…