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的时候该对象和对应的终结器引用就可以被回收了

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

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

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

相关文章

【JavaEE初阶】计算机是如何工作的

一、计算机发展史 计算的需求在⼈类的历史中是广泛存在的,发展大体经历了从⼀般计算⼯具到机械计算机到目前的电子计算机的发展历程。 人类对计算的需求,驱动我们不断的发明、改善计算机。目前这个时代是“电子计算机”的时代,发展的潮流是…

Qt按钮大全续集(QCommandLinkButton和QDialogButtonBox )

## QCommandLinkButton 控件简介 QCommandLinkButton 控件中文名是“命令链接按钮”。QCommandLinkButton 继承QPushButton。CommandLinkButton 控件和 RadioButton 相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是 CommandLinkButton 除带有正常的按钮上的文…

通过汇编理解cortex-m3:第0章

第0章:准备工作 基本想法:利用汇编和gdb调试,来学习cortex-m3汇编指令,以及一些寄存器的功能。 软件和硬件: 硬件:韦东山瑞士军刀中的最小核心板(STM32F103C8T6) STLINK-V2&#…

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

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

ROS参数服务器(Param):通信模型、Hello World与拓展

参数服务器在ROS中主要用于实现不同节点之间的数据共享。 参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。 使用场景一般存储一些机器人的固有参数&…

C语言实现冒泡排序(超详细)

排序算法 - 冒泡排序 什么是冒泡排序?冒泡排序有啥用呢?冒泡排序的实现代码讲解冒泡排序的总结 什么是冒泡排序? 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序…

OpenHarmony源码下载

OpenHarmony源码下载 现在的 OpenHarmony 4.0 源码已经有了,在 https://gitee.com/openharmony 地址中,描述了源码获取的方式,但那是基于 ubuntu 或者说是 Linux 的下载方式。在 windows 平台下的下载方式没有做出介绍。 我自己尝试了 wind…

Python 爬虫入门

文章目录 Python 爬虫入门requests 库beautifulsoup4库函数findall(),find()函数get() 爬虫实例 1:抓小说爬虫实例 2:抓豆瓣 top 250 的电影信息后记 Python 爬虫入门 Python 的爬虫功能使得程序员可以快速抓取并分析网页中的信息&#xff0…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

大数据HCIE成神之路之数学(2)——线性代数

线性代数 1.1 线性代数内容介绍1.1.1 线性代数介绍1.1.2 代码实现介绍 1.2 线性代数实现1.2.1 reshape运算1.2.2 转置实现1.2.3 矩阵乘法实现1.2.4 矩阵对应运算1.2.5 逆矩阵实现1.2.6 特征值与特征向量1.2.7 求行列式1.2.8 奇异值分解实现1.2.9 线性方程组求解 1.1 线性代数内…

谈谈如何写作(二)

序言 没有什么比一套好理论更有用了。——库尔特勒温 谈谈如何写作系列今天进入第二篇,第一篇请速戳:谈谈如何写作(一) 今天,博主从如何写报告讲起。 Q:如何写报告 如何写报告呢? 当每位盆友接到…

【华为HCIP | 华为数通工程师】刷题日记1116(一个字惨)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

阿里云ECS11月销量王 99元/年

这一波好像真没得说,老用户居然都有份,买来练习、测试冒似已经够了! 阿里云ECS11月销量王 99元/年 2核2G 3M固定带宽不限流量,新老同享,新购、续费同价,开发必备! 活动规则 云服务器ECS 云创季…

DevToys:开发者的多功能瑞士军刀,让编程更高效!

DevToys:开发者的多功能瑞士军刀,让编程更高效! DevToys 是一款专为开发者设计的实用工具,它能够帮助用户完成日常的开发任务,如格式化 JSON、比较文本和测试正则表达式(RegExp)。它的优势在于…

OpenAI Assistants-API简明教程

OpenAI在11月6号的开发者大会上,除了公布了gpt4-v、gpt-4-turbo等新模型外,还有一个assistants-api,基于assistants-api开发者可以构建自己的AI助手,目前assistants-api有三类的工具可以用。首先就是之前大火的代码解释器(Code In…

leetcode刷题日志-68.文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可…

『亚马逊云科技产品测评』活动征文|借助AWS EC2搭建服务器群组运维系统Zabbix+spug

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 本文基于以下软硬件工具: aws ec2 frp-0.52.3 zabbix 6…

【STM32】ADC(模拟/数字转换)

一、ADC的简介 1.什么是ADC 1)将【电信号】-->【电压】-->【数字量】 2)ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁。 3)12位逐次逼近型ADC,1us转换时间&#xf…

中间件安全:Apache 目录穿透.(CVE-2021-41773)

中间件安全:Apache 目录穿透.(CVE-2021-41773) Apache 的 2.4.49、2.4.50 版本 对路径规范化所做的更改中存在一个路径穿越漏洞,攻击者可利用该漏洞读取到Web目录外的其他文件,如系统配置文件、网站源码等&#xff0c…

Python---return返回值

return返回值 返回值:很多函数在执行完毕后,会通过return关键字返回一个结果给 调用它的位置。 return 英 /rɪˈtɜːn/ n. 回来,返回; 思考:如果一个函数需要两个return (如下所示),程序如何执行&…