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

news/发布时间2024/9/20 6:08:52

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时,这个虚引用会放到引用队列里。
    • 由于虚引用可以跟踪对象的回收时间,因此也可以将一些资源释放操作放在虚引用中执行和记录
    • 请添加图片描述
    • 请添加图片描述
  • 终极器引用
    • 请添加图片描述

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

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

相关文章

对于爬虫的学习

本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求:找出里面所有javaxxString str"Java自从95年问世以来,经历了…

UE4c++ 材质功能大全(想起来就补充一个)

前言:才想起写一个这个文档,前期内容较少,其他内容,我也只会想起来加一加! 材质功能大全 竖直百分比进度HSV To RGBRGB转灰度值AlphaComosote(Premultiplied Alpha)预乘 转 Translucent (sRGB与…

网络协议栈和os的关系(网络协议栈和计算机体系结构图相结合),用户如何从网络获取数据+本质,简述网络通信的本质

目录 网络协议栈和os的关系 思考联系 实际 用户从网络获取数据的过程 本质 如何获取 -- 系统调用 图示 不同的os 网络通信的本质 两台主机通信流程 网络协议栈和os的关系 思考联系 网络协议栈涵盖了硬件和软件,而os正是管理软硬件资源的中枢 os是计算机体系结构的一…

sqlserver保存微信Emoji表情

首先将数据库字段,设置类型为 nvarchar(200)一个emoji表情,占4字节就可以了,web前端展示不用改任何东西,直接提交数据保存;回显也会没有问题,C#代码不用做任何处理; 不哭不闹要睡觉&#x1f31…

AWS 认证报名考试流程

AWS认证的考试包括,可以申请线上或者线下考试。 考试类型 线上: 优点:方便快捷无需通勤,随时约随时考,基本上每天都可以 缺点:对环境要求较高,屋子里只能有自己,而且不能有其他声音…

WordPress分类目录ID怎么看?如何查找WordPress标签ID?

在WordPress网站中,我们需要判断某篇文章是否属于某个分类目录,或者是否拥有某个标签,那么就需要用到分类目录ID和标签ID,那么WordPress分类目录ID怎么看?如何查找WordPress标签ID?下面boke112百科就跟大家…

Java基于springboot的厨艺交流平台的设计与实现代码

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功…

Office/WPS 好用的PPT插件-智能选择布局

软件介绍 PPT大珩助手是一款全新设计的Office PPT插件,它是一款功能强大且实用的PPT辅助工具,能够轻松帮助您修改、优化和管理幻灯片。凭借丰富的功能和用户友好的界面,PPT大珩助手能够助力您打造出精美而专业的演示文稿。我们致力于为用户提…

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架,现在属于此领域star最多的框架,其被广泛应用于构建前台界面,但或许很少人知道,他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…

idea使用maven创建springboot项目

按照图片中的流程来,就可以创建springboot项目,我这个主要是想做一个JavaWeb项目 有用的话,点个小赞赞再走呀~

【STM32】江科大STM32学习笔记汇总(50)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…

day08_分类品牌管理商品规格管理商品管理

文章目录 1 分类品牌管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 品牌列表加载1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端对接brand.jscategoryBrand.vue 1.5 分类数据加载1.6 列表查询1.6.1 需求说明1.6.2 后端接口需求分析Categor…

亿道信息轻工业三防EM-T195,零售、制造、仓储一网打尽

厚度仅10.5mm,重量仅0.65千克的EM-T195,其紧凑而纤薄的设计为以往加固型平板带来了全新的轻薄概念。尽管设计时尚、轻薄,但经过军用认证的强固性仍然能够承受所有具有挑战性的环境条件。随身携带无负担的轻便性加上抗震功能使其成为餐厅、酒店…

人脸识别技术应用哪些地方?

人脸识别技术,作为现代科技的一大突破,已经在众多领域找到了应用之地。从公共安全到商业营销,从医疗健康到教育娱乐,人脸识别技术以其独特的优势,正在逐渐改变我们的生活方式。 在公共安全领域,人脸识别技术…

鸿蒙 渲染控制

前提:基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌) 1.概念 ArkUI通过自定义组件的build()函数和builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了…

npm与包

包 包的概念 Node.js中的第三方模块又叫做包。包的来源 由第三方个人或团队开发出来的,免费提供给所有人使用。为什么需要包 由于Node.js内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发时,效率很低。包是基于内置模块封装出…

Vue.js的双向绑定原理

Vue的双向绑定 vue双向绑定是其最重要的核心亮点,其原理也很简单,这里做个简单总结 vue2的双向绑定是利用的Object.definePropertyvue3的双向绑定是利用的 ES6Porxy中的defineProperty(target, propKey, propDesc 其作用类似于Object.defineProperty …

【脑切片图像分割】MATLAB 图像处理 源码

1. 简单图像处理 加载图像 Brain.jpg,使用直方图和颜色分割成区域这些区域有不同的颜色。 这是一个更高级的问题,有多个解决它的方法。 例如,您可以计算具有特定数字的图像的直方图(例如 16 - 32),找到直方…

在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁

内核-用户空间鸿沟 构建自己的 TCP栈是一项极具挑战的任务。通常,当用户空间应用程序需要互联网连接时,它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据,从而消除了直接处理原始数据包的复杂性。…

SpringBoot底层原理

SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式,分别为: application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时,配置文件会按照它们的优先级生效。 优先级从高到底…
推荐文章