当前位置: 首页 > news >正文

JVM 第四部分—垃圾回收相关概念 2

System.gc()

  • 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存

  • 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。

  • jvm实现者可以通过System.gc()调用来决定jvm的GC行为。而一般情况下,垃圾回收是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,比如我们在编写一个性能基准,我们可以在运行之前调用System.gc()

  • 方法3没有GC,方法4GC。因为变量虽然只在代码块里面起作用,但是在方法3的局部变量表里还存在着,而方法4局部变量表里,value覆盖了buffer

请添加图片描述

请添加图片描述

请添加图片描述

内存溢出

请添加图片描述

请添加图片描述

请添加图片描述

内存泄露

请添加图片描述

请添加图片描述

请添加图片描述

STW—Stop the World

  • 指的是GC事件发生过程中,会产生应用程序的卡顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW
    • 可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿。
      • 分析工具必须在一个能确保一致性的快照中进行
      • 一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上
      • 如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证
  • 被STW中断的应用程序线程会在完成GC之后恢复,频繁中断会让用户感觉像网速不快造成电影卡带一样,所以我们需要减少STW的发生
  • STW和采用哪款GC无关,所有的GC都有这个事件【只要用可达性分析算法的GC】
  • 哪怕是G1也不能完全避免stop-the-world情况发生,只能说垃圾回收器越来越优秀,回收效率越来越高,尽可能地缩短了暂停时间
  • STW是JVM在后台自动发起和自动完成的。在用户不可见的情况下,把用户造成的工作线程全部停掉
  • 开发中不要用System.gc()会导致STW

垃圾回收的并发与并行

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

安全点和安全区域

  • 程序执行时,并非能在所有的地方都能停下来GC,只有在特定的位置停顿下来开始GC,这些位置称为安全点(Safepoint)
  • Safe Point 的选择很重要,不能太多,不能太少。太多会导致程序频繁停顿,影响程序性能,太少会导致GC等待的时间太长
  • 通常会选择一些执行时间较长的指令作为 SafePoint,比如方法调用,循环跳转和异常跳转等
  • 如何在GC开始时,保证所有线程都跑到最近的安全点停下来?
    • 抢占式中断(现在没有虚拟机用了):先中断所有线程,如果有线程不足安全点,恢复那些线程,让他们跑到安全点
    • 主动式中断:设置一个中断标志(表示要GC了,需要中断了),线程到达安全点会轮询这个标志,如果这个标志为真,线程就会自己中断挂起,如果为假,线程就继续执行
  • 安全区域:在线程处于Sleep或Blocked等不执行的状态时,无法响应jvm的中断请求,无法走到安全点去中断挂起。jvm也不会等待线程唤醒。这时就需要安全区域了。安全区域指的是在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。可以把安全区域看成被扩展了的安全点
  • 实际执行时:
    • 1.当线程运行到SafeRegion的代码时,首先标识这个线程进入了SafeRegion,如果这段时间内发生GC,jvm会忽略标识为SafeRegion状态的线程【应该讲错了,应该不会忽略】
    • 2.当线程即将离开安全区域时,会检测GC是否已经完成,如果完成了,则继续执行。如果没有完成,线程必须等待直到收到可以安全离开安全区域的信号为止

引用【强软弱虚!】

  • 强引用——不会被回收
    • 使用场景:平时new对象时,使用的就是强引用,普通程序99%都是强引用
    • 一个普通对象,如果没有被引用,或者超出了引用的作用域,或者强引用显式赋值为null,就可以当作垃圾收集了
    • 可以直接访问目标对象
    • 是造成内存泄露的一个原因
    • 请添加图片描述
  • 软引用——直到不回收直到报OOM才会回收(内存够的时候,GC了也不回收)
    • 使用场景:缓存
    • 只被软引用关联着的对象,在系统将要发生OOM前,会把这些对象列进回收范围之中进行第二次回收。如果回收之后内存还是不够,就OOM
    • 垃圾回收器在某个时刻决定回收软可达的对象时,会清理软引用,并可选地把引用放到一个引用队列
    • 请添加图片描述
    • 获取对象是:userSoftRef.get()
  • 弱引用——只要GC就会被回收
    • 使用场景:缓存,比如用WeakHashMap做缓存
    • 虽然一GC就会被回收,但是GC线程优先级很低,所有不一定能很快地发现持有弱引用的对象,可以存活较长时间
    • 软引用弱引用都很适合保存那些可有可无的缓存数据。因为它可以在内存多的时候可以存活较长时间,加速系统,内存不够的时候也可以被回收,不被占用
    • 请添加图片描述
  • 虚引用——有了像没有一样,唯一目的(不是作用)是用来通知对象被回收了
    • 也称为“幽灵引用”“幻影引用”,是所有引用中最弱的一个
    • 对象有了虚引用也不会影响它的GC过程,有没有都一样
    • 虚引用不能单独使用,也不能通过虚引用获得被引用的对象。用get()方法得到结果为null
    • 为一个对象设置虚引用的唯一目的在于跟踪垃圾回收过程。比如能在这个对象被GC时收到一个系统通知
    • 虚引用必须和引用队列一起用。因为当这个对象被GC时,这个虚引用会放到引用队列里。
    • 由于虚引用可以跟踪对象的回收时间,因此也可以将一些资源释放操作放在虚引用中执行和记录
    • 请添加图片描述
    • 请添加图片描述
  • 终极器引用
    • 请添加图片描述

相关文章:

JVM 第四部分—垃圾回收相关概念 2

System.gc() 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明,无法保证对垃…...

tritonserver学习之八:redis_caches实践

tritonserver学习之一:triton使用流程 tritonserver学习之二:tritonserver编译 tritonserver学习之三:tritonserver运行流程 tritonserver学习之四:命令行解析 tritonserver学习之五:backend实现机制 tritonserv…...

2024有哪些免费的mac苹果电脑深度清理工具?CleanMyMac X

苹果电脑用户们,你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅?可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻,拥有一些高效的深度清理工具就显得尤为重要。今天,我将介绍几款优秀的苹果电脑深度清理工具…...

UE5中实现后处理深度描边

后处理深度描边可以通过取得边缘深度变化大的区域进行描边,一方面可以用来做角色的等距内描边,避免了菲尼尔边缘光不整齐的问题,另一方面可以结合场景扫描等特效使用,达到更丰富的效果: 后来解决了开启TAA十字线和锯齿…...

Java面试值之集合

集合 1.HashMap底层?扩容机制?1.7-1.8的升级?2.HashMap的长度为什么是2的幂次方?3.HashMap 插入1.7和1.8的区别?4.什么是红黑树?O(logn)5.HashMap为什么会使用红黑树?6.ArrayList底层?扩容机制?7.LinkedList底层?扩容机制?8.ArrayList可以序列化,但是为什么不直接序…...

React之组件定义和事件处理

一、组件的分类 在react中,组件分为函数组件和class组件,也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件,因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数,它就会影响当前项…...

LeetCode -55 跳跃游戏

LeetCode -55 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。…...

Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧,08年就听说这东西,当时也有同事投入去看,因为恶心Java,始终对这玩意无感,没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业,所以只能回过头又来学。 首先还是…...

关于Node.js异常处理的教程

在Node.js开发中,异常处理是非常重要的一部分。良好的异常处理可以帮助我们及时发现和解决问题,提高系统的稳定性和可靠性。本教程将向您介绍Node.js中异常处理的最佳实践和策略。 1. 使用try-catch捕获同步异常 在Node.js中,可以使用try-c…...

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的? 2.3、如何使用 Protoc 生成代码? 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…...

Spring: Springboot 框架集成不同版本的spring redis

文章目录 一、集成不同版本的spring redis1、Spring Data Redis 1.x:2、Spring Data Redis 2.x:3、Spring Data Redis 3.x(Spring Boot 2.x): 二、springboot集成Spring Data Redis 2.x1、首先,确保在 pom.…...

学习JAVA的第八天(基础)

目录 多态 前提 形式 测试类 调用成员的特点 优势 劣势 包 注意事项: final关键字 常量 命名规范: 注意事项: 权限修饰符 分类 代码块 局部代码块 构造代码块 静态代码块 抽象类 抽象类: 定义格式 抽象…...

【硬件相关】IB网/以太网基础介绍及部署实践

文章目录 一、前言1、Infiniband网络1.1、网络类型1.2、网络拓扑1.3、硬件设备1.3.1、网卡1.3.2、连接线缆a、光模块b、线缆 1.3.4、交换机 2、Ethernet网络 二、部署实践(以太网)1、Intel E810-XXVDA21.1、网卡信息1.2、检查命令1.2、驱动编译 2、Mella…...

【JavaEE】_Spring MVC项目之建立连接

目录 1. Spring MVC程序编写流程 2. 建立连接 2.1 RequestMapping注解介绍 2.2 RequestMapping注解使用 2.2.1 仅修饰方法 2.2.2 修饰类与方法 2.3 关于POST请求与GET请求 2.3.1 GET请求 2.3.2 POST请求 2.3.3 限制请求方法 1. Spring MVC程序编写流程 1. 建立连接&…...

【JavaEE进阶】 Spring AOP源码简单剖析

文章目录 🍃前言🍀Spring AOP源码剖析⭕总结 🍃前言 前面的博客中,博主对代理模式进行了一个简单的讲解,接下来博主将对Spring AOP源码进行简单剖析,使我们对Spring AOP了解的更加深刻。 🍀Sp…...

Redis--内存回收机制详解

什么是内存回收机制? 众所周知Redis之所以性能高是因为数据都存在内存中,内存是很宝贵的,Redis的内存回收机制本质就是处理达到过期时间的key-value,以及当内存到达最大使用值时候触发的内存淘汰策略。 Redis数据删除的策略有哪些&#xf…...

win安装卸载python3.13

一、安装 访问python官网:https://www.python.org/ 点击“Downloads” 点击“Windows” 找到自己要下载的版本和位数,比如我这个是3.13版本、64位的安装包 下载好了之后,双击安装包 勾选“Add python.exe to PATH”:把python环…...

APIFox-自动获取登录状态操作

APIFox-自动获取登录状态操作 概述 作为纯后端开发码农,每次接口开发完的调试很重要,因此每次重复的手动获取登陆状态Token或者直接放行就太麻烦了。 APIFox提供了前置操作,可以很方便的自动获取登录状态,节省大量重复劳动时间。…...

【NDK系列】Android tombstone文件分析

文件位置 data/tombstone/tombstone_xx.txt 获取tombstone文件命令: adb shell cp /data/tombstones ./tombstones 触发时机 NDK程序在发生崩溃时,它会在路径/data/tombstones/下产生导致程序crash的文件tombstone_xx,记录了死亡了进程的…...

CentOS7 Hive2.3.8安装

CentOS7 Hive2.3.8 安装 建议从头用我的博客,如果用外教的文件到 一、9)步骤了,就用他的弄完,数据库不一样,在9步骤前还能继续看我的 一、 安装MySQL 0.0)查询mariadb,有就去0.1),没有就不管…...

菲菲更名宝贝:解决文件名批量修改与批量重命名的实战技巧

你是否有过这样的烦恼:相机导出的几百张照片全是“IMG_0001、IMG_0002”,想改成有意义的名称却只能一张张重命名;下载的一堆电子书文件名里夹杂着广告词,手动删除要到猴年马月;公司里几十份报表需要统一添加日期前缀&a…...

高校无线网络优化实战:从信号覆盖到安全管理的全流程解析

1. 高校无线网络优化的必要性 校园无线网络就像校园里的"水电煤",已经成为师生日常教学和生活的基础设施。十年前,大家可能只要求"能连上WiFi"就行,但现在的情况完全不同了——教授在阶梯教室用4K视频教学,学…...

Linux环境下Photoshop CC 2022的Wine兼容层架构解析与部署方案

Linux环境下Photoshop CC 2022的Wine兼容层架构解析与部署方案 【免费下载链接】Photoshop-CC2022-Linux Installer from Photoshop CC 2021 to 2022 on linux with a GUI 项目地址: https://gitcode.com/gh_mirrors/ph/Photoshop-CC2022-Linux Photoshop-CC2022-Linux项…...

英雄联盟本地自动化工具:LeagueAkari 完整指南与实战教程

英雄联盟本地自动化工具:LeagueAkari 完整指南与实战教程 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari 是一款基于官…...

5步掌握SD-PPP:Photoshop与AI绘图的无缝协作终极指南

5步掌握SD-PPP:Photoshop与AI绘图的无缝协作终极指南 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP是一款革命性的Photoshop AI插件,它彻底改变了设计师与人工智能绘图工具之间的工…...

Cosmos-Reason1-7B代码生成实战:辅助Python爬虫开发与优化

Cosmos-Reason1-7B代码生成实战:辅助Python爬虫开发与优化 1. 引言 做数据采集的朋友,估计都经历过这样的时刻:盯着一个网站,脑子里已经想好了要抓什么数据,但打开编辑器,从零开始写爬虫代码,…...

Fluent Meshing实战:从几何到求解就绪网格的自动化之路

1. Fluent Meshing入门:为什么选择自动化网格生成? 第一次接触CFD仿真时,我像大多数工程师一样被网格生成折磨得够呛。记得有个汽车后视镜的案例,光是清理CAD缝隙就花了整整三天,生成的四面体网格质量差到根本没法计算…...

为什么92%的AI初创公司输在IP起点?——基于56个真实败诉案例的AI研发全生命周期权属漏洞图谱

第一章:AI原生软件研发知识产权保护策略的底层逻辑 2026奇点智能技术大会(https://ml-summit.org) AI原生软件的研发范式已从根本上重构知识产权(IP)的生成、归属与边界——模型权重、提示工程链、微调数据集、推理服务接口乃至训练日志&…...

UE5项目实战:手把手集成Protobuf与Abseil库

1. 环境准备与工具检查 在开始集成Protobuf和Abseil之前,我们需要确保开发环境配置正确。我使用的是UE5.2.1和Visual Studio 2022组合,这个搭配目前稳定性最好。如果你还在用VS2019,建议升级到2022版本,因为Protobuf新版本对C20标…...

2026艺考志愿填报深度解析:一线实战过来人分享核心技巧

宝子们,艺考志愿填报可是个技术活,稍有不慎就可能与理想院校失之交臂!别慌,优志愿来帮你。下面就来看看优志愿在艺考志愿填报中的核心优势。优志愿艺考填报之AI精准赋能优志愿融合前沿AI技术与独创6大核心算法,基于百亿…...