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

JVM垃圾回收相关概念

目录

一、System.gc()的理解

二、内存溢出与内存泄露

(一)OOM

(二)内存泄露

三、StopTheWorld

四、垃圾回收的并行与并发

五、安全点与安全区域

(一)安全点

(二)安全区域

六、引用

(一)强引用

(二)软引用

(三)弱引用

(四)虚引用

(五)终结器引用


一、System.gc()的理解

System.gc或Runtime.getRuntime().gc()的调用,会显示触发FullGC,同时会对老年代和新生代进行回收,尝试释放被丢对象占用的内存。然而System.gc调用无法保证对垃圾收集器的调用,即运行这行代码并不一定会产生垃圾回收。

一些特殊情况下,比如编写性能基准,我们可以在运行之间调用System.gc

二、内存溢出与内存泄露

(一)OOM

1、java 虚拟机的堆内存设置不够

2、代码创建大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)

(二)内存泄露

只有对象不再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄露

实际情况有一些疏忽导致对象的生命周期变的很长甚至OOM,宽泛意义上的内存泄露

举例

  • 单例的生命周期和程序是一样长,如果单例程序中,持有对外部对象的引用的话,那么这个外部对象是不能被回收的,导致内存泄露
  • 一些提供close的资源未关闭导致内存泄露,如数据库链接,网络链接,和IO

三、StopTheWorld

指的是在垃圾回收线程工作时停止用户线程的一种情况,也称为STW。

四、垃圾回收的并行与并发

首先理解最基本的并行与并发

并发:同一时间段内,几个程序都在同一个处理器上运行   CPU切换

并行:一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互相不抢占资源,可以同时进行,我们称之为并行      并行因素取决于CPU的核心数量

并发的多个任务之间抢占资源,并行多个任务之间不互相抢占资源

垃圾回收器中的

  • 串行指的是单个垃圾回收线程串行执行,例如Serial收集器
  • 并行指的是多个垃圾回收线程并行执行,例如ParNew收集器
  • 并发指的是垃圾回收线程和用户线程并发执行,例如CMS收集器

五、安全点与安全区域

(一)安全点

程序执行并非在所有地方都能停顿下来开始GC,只有特定的位置才能停顿下来开始GC,这些位置称为安全点

有了安全点的设定,也就决定了用户程序执行时 并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。因此,安全点的选定既不能太少以至于让收集器等待时间过长,也不能太过频繁以至于过分增大运行时的内存负荷。安全点位置的选取基本上是以“ 是否具有让程序长时间执行的特征 为标准进行选定的,因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这样的原因而长时间执行,“ 长时间执行 的最明显特征就是指令序列的复用,例如方法调用、循环跳转、异常跳转等都属于指令序列复用,所以只有具有这些功能的指令才会产生安全点。
对于安全点,另外一个需要考虑的问题是,如何在垃圾收集发生时让所有线程(这里其实不包括
执行 JNI 调用的线程)都跑到最近的安全点,然后停顿下来。这里有两种方案可供选择:抢先式中断 (Preemptive Suspension )和主动式中断( Voluntary Suspension
  • 抢先式中断
    • 中断所有线程,如果还有线程不在安全点,就恢复线程,让线程跑到安全点
    • 没有虚拟机采用
  • 主动式中断
    • 设置一个中断标志,各个线程运行到安全点的时候,主动轮询这个标志,如果标志为真,则将自己进行中断挂起

(二)安全区域

如果线程处于sleep或者blocked状态,这时候线程无法响应jvm中断请求,走到安全点去中断挂起。对于这种情况,就需要安全区域来解决

安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中任何位置开始GC都是安全的。

当线程运行到安全区域代码时,首先标志已经进入了安全区域,如果GC,JVM会忽略标识为安全区域状态的线程

当线程即将离开安全区域时,会检查JVM是否已经完成GC,如果完成了,则继续运行。否则线程必须等待直到收到可以安全离开安全区域的信号为止

六、引用

Java中有五种引用

(一)强引用

强引用是最传统的引用定义,程序代码中普遍存在的引用赋值,类似new Object这种引用关系,无论任何情况下,强引用存在,垃圾收集器永远不会回收掉被引用的对象

强引用是造成java内存泄露的主要原因之一,强引用可以直接访问目标对象

(二)软引用

若某个对象被软引用,当gc一次后内存仍然紧张时,该对象在第二次gc会被回收

(三)弱引用

若某个对象被弱引用,当gc发生时,该对象会被回收

:软和弱引用不一定要配合引用队列(引用队列:每个引用自身也会占用一定的内存,当其指向的对象被垃圾回收时,也可以将引用入队,然后通过referenceHandler来定期查看队列是否有新的引用入队,然后进行清除引用回收内存)

(四)虚引用

一个对象是否有虚引用存在,完全不会对其生存时间构成影响。唯一目的就是在这个对象被收集器回收时收到一个系统通知。它不能单独使用,也无法通过虚引用获取被引用的对象。

比如bytebuffer被回收时,其分配的直接内存没有释放,此时虚引用入队,Cleaner通过底层调用Unsafe.freeMemory()方法来释放直接内存(由Reference Handler线程调用虚引用相关方法释放直接内存)

(五)终结器引用

Object有一个finallize方法。当我们重写该方法且该对象没有强引用指向它时,虚拟机会生成一个终结器引用,在第一次gc的时候将引用加入引用队列(此时对象并没有被回收),然后会有一个优先级较低的finallizeHandler线程查看队列是否有终结器引用,如果有就调用其指向对象的finallize终结方法,然后下一次gc的时候该对象和对应的终结器引用就可以被回收了

注:虚和终结器引用一定要配合引用队列  

相关文章:

JVM垃圾回收相关概念

目录 一、System.gc()的理解 二、内存溢出与内存泄露 (一)OOM (二)内存泄露 三、StopTheWorld 四、垃圾回收的并行与并发 五、安全点与安全区域 (一)安全点 (二)安全区域 …...

C++各种字符转换

C各种字符转换 一.如何将char数组转化为string类型二. string转char数组:参考 一.如何将char数组转化为string类型 在C中,可以使用string的构造函数或者赋值操作符来将char数组转换为string类型。 方法1:使用string的构造函数 const char* c…...

MSSQL-逻辑级常用命令

--SQL Server 查询表的记录数 --one: 使用系统表. SELECT object_name (i.id) TableName, rows as RowCnt FROM sysindexes i INNER JOIN sysObjects o ON (o.id i.id AND o.xType U ) WHERE indid < 2 ORDER BY rows desc ————————————…...

【如何学习Python自动化测试】—— 时间等待

3 、 时间等待 在做自动化测试时&#xff0c;难免会碰到一些问题&#xff0c;比如你在脚本中操作某个对象时&#xff0c; 页面还没有加载出来&#xff0c;你的操作语句已经被执行&#xff0c;从而导致脚本执行失败&#xff0c;针对这样的问题 webdriver 提供了等待操作&#xf…...

《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

《数字图像处理-OpenCV/Python》连载&#xff08;44&#xff09;图像的投影变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变…...

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…...

Asp.net MVC Api项目搭建

整个解决方案按照分层思想来划分不同功能模块&#xff0c;以提供User服务的Api为需求&#xff0c;各个层次的具体实现如下所示&#xff1a; 1、新建数据库User表 数据库使用SQLExpress版本&#xff0c;表的定义如下所示&#xff1a; CREATE TABLE [dbo].[User] ([Id] …...

C语言中文网 - Shell脚本 - 8

第1章 Shell基础&#xff08;开胃菜&#xff09; 8. Linux Shell命令提示符 启动 Linux 桌面环境自带的终端模拟包&#xff0c;或者从 Linux 控制台登录后&#xff0c;便可以看到 Shell 命令提示符。看见命令提示符就意味着可以输入命令了。命令提示符不是命令的一部分&#x…...

性能测试学习——项目环境搭建和Jmete学习二

项目环境搭建、Jmeter学习二 环境的部署虚拟机的安装虚拟机中添加项目操作步骤 使用环境的注意事项Jmeter的安装和简单使用Jemter的使用的进阶Jemter元件 Jmeter属性执行顺序和作用域作用域以自定义用户变量和用户参数(前置处理器)为例如何解决用户变量和线程组同级时&#xff…...

C++标准模板库(STL)-map介绍

C标准库中的map是一种关联容器&#xff0c;它提供了键值对的映射关系。每个键值对中的键都是唯一的&#xff0c;通过键可以访问对应的值。 map基本操作 插入元素&#xff1a; 使用insert函数插入元素&#xff0c;该函数有两种形式&#xff1a; // 插入一个pair<const Ke…...

使用docker部署ELK日志框架-Elasticsearch

一、ELK知识了解 1-ELK组件 工作原理&#xff1a; &#xff08;1&#xff09;在所有需要收集日志的服务器上部署Logstash&#xff1b;或者先将日志进行集中化管理在日志服务器上&#xff0c;在日志服务器上部署 Logstash。 &#xff08;2&#xff09;Logstash 收集日志&#…...

第7章 模式匹配与正则表达式

目录 1. 不用正则表达式来查找文本模式2. 用正则表达式来查找文本模式2.1 创建正则表达式&#xff08;Regex&#xff09;对象2.2 匹配Regex对象 3. 用正则表达式匹配更多模式3.1 利用括号分组3.2 用管道匹配多个分组3.3 用问号实现可选匹配3.4 用星号匹配零次或多次3.5 用加号匹…...

单元测试实战(三)JPA 的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…...

初刷leetcode题目(3)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…...

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)...

C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑

本文涉及的基础知识点 二分查找算法合集 离线查询 题目 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑 j 满足 heights[i] < heights[j] &#xff0c;那么这个…...

建立跨层全栈的区块链安全保障系统-应用层,系统层,设施层

目录 建立跨层全栈的区块链安全保障系统 应用层 系统层 设施层...

程序员告诉你:人工智能是什么?

随着科技的快速发展&#xff0c;人工智能这个词汇已经逐渐融入了我们的日常生活。然而&#xff0c;对于大多数人来说&#xff0c;人工智能仍然是一个相对模糊的概念。 首先&#xff0c;让我们从人工智能的定义开始。人工智能是一种模拟人类智能的技术&#xff0c;它涵盖了多个领…...

飞书开发学习笔记(七)-添加机器人及发送webhook消息

飞书开发学习笔记(七)-添加机器人及发送webhook消息 一.添加飞书机器人 1.1 添加飞书机器人过程 在群的右上角点击折叠按键…选择 设置 群机器人中选择 添加机器人 选择自定义机器人&#xff0c;通过webhook发送消息 弹出的信息中有webhook地址&#xff0c;选择复制。 安…...

C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C统计数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C统计数 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列…...

终极音乐解锁指南:3个简单步骤让加密音乐重获自由

终极音乐解锁指南&#xff1a;3个简单步骤让加密音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://g…...

基于MultiFold无分箱反卷积的轻子-喷注方位角不对称性测量

1. 项目概述与核心物理动机在粒子物理的高能前沿&#xff0c;我们常常通过“撞击”基本粒子来窥探其内部结构&#xff0c;深度非弹性散射&#xff08;DIS&#xff09;就是其中最经典、最有力的探针之一。想象一下&#xff0c;你用一束极高能量的电子&#xff08;或正电子&#…...

机器学习势函数在高压氢模拟中的基准测试与实战指南

1. 项目概述与背景高压氢的研究&#xff0c;尤其是其液-液相变行为&#xff0c;一直是凝聚态物理和行星科学领域的前沿课题。理解氢在极端条件下的物态&#xff0c;对于揭示巨行星内部结构、探索新型超导材料乃至惯性约束聚变等应用都至关重要。然而&#xff0c;传统的模拟方法…...

集合卡尔曼滤波结合机器学习代理模型的长期精度理论分析与实践

1. 项目概述&#xff1a;当集合卡尔曼滤波遇上机器学习代理模型在气象预报、海洋环流模拟乃至地质勘探这些领域&#xff0c;我们常常面临一个核心挑战&#xff1a;如何从充满噪声的、不完整的观测数据中&#xff0c;准确地推断出复杂动力系统的真实状态&#xff1f;这就像是在一…...

量子机器学习在日志异常检测中的应用:QULOG框架解析与实践

1. 项目概述与核心价值日志异常检测&#xff08;Log-based Anomaly Detection, LogAD&#xff09;是智能运维&#xff08;AIOps&#xff09;的基石&#xff0c;其核心任务是从海量、半结构化、充满噪声的系统日志流中&#xff0c;自动识别出预示着潜在故障或异常行为的模式。随…...

【独家首发】基于237份真实Claude集成工单分析:文档缺失导致的故障占比达64.3%,附可落地的文档健康度评估矩阵

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Claude API文档编写的核心价值与现状洞察 高质量的API文档是Claude集成生态中不可替代的基础设施。它不仅降低开发者接入门槛&#xff0c;更直接影响模型能力的释放效率、错误率控制水平及企业级部署的可维护性…...

基于进化算法的AutoML优化小分子药代动力学性质预测

1. 项目概述与核心价值在药物研发的漫长且昂贵的征途中&#xff0c;早期筛选环节就像是淘金&#xff0c;目标是从海量的小分子化合物中&#xff0c;快速、准确地识别出那些有潜力成为药物的“金子”。其中&#xff0c;药代动力学&#xff08;Pharmacokinetics&#xff0c; PK&a…...

Mamba-X:为Vision Mamba模型定制的边缘AI硬件加速器架构解析

1. 项目概述&#xff1a;当视觉Transformer遇上状态空间模型最近在边缘AI硬件加速的圈子里&#xff0c;一个名为“Mamba-X”的设计概念开始被频繁讨论。这名字听起来有点神秘&#xff0c;但核心其实很明确&#xff1a;它瞄准的是当下两个最火热的AI架构趋势——Vision Transfor…...

LLM多智能体驱动微服务自治:从架构设计到Sock Shop实战评估

1. 项目概述&#xff1a;当微服务遇见大模型&#xff0c;自管理不再是空谈在云原生和微服务架构成为主流的今天&#xff0c;我们运维工程师面对的早已不是几台物理服务器&#xff0c;而是一个由成百上千个容器化服务实例构成的、动态且复杂的生态系统。服务间的调用链路像一张错…...

机器学习优化算法在激光等离子体加速实验中的应用与选型指南

1. 项目概述&#xff1a;当机器学习算法遇见激光等离子体加速在激光等离子体加速&#xff08;Laser Wakefield Acceleration, LWFA&#xff09;这类前沿物理实验中&#xff0c;我们常常面临一个经典难题&#xff1a;如何从一堆相互耦合、影响复杂的实验参数中&#xff0c;快速、…...