学习笔记6——垃圾回收

学习笔记系列开头惯例发布一些寻亲消息

链接:https://baobeihuijia.com/bbhj/contents/3/190801.html
在这里插入图片描述

java垃圾回收(stop the world)

  • 专注于堆和方法区的垃圾回收,年轻代,老年代,永久代
  • 判断对象是否还存活?(区分尸体)
    • 引用计数算法
      • 给每个对象保存一个整型的引用计数器类型,用于记录对象被引用的情况
      • 缺点就是无法处理循环引用的情况,导致内存泄漏
    • 可达性分析算法
      • 找到GC ROOT对象,从根节点开始扩展访问
  • finalization机制(死前挣扎机制)
    • 用于在对象被回收时进行资源释放,比如关闭文件,套接字和数据库连接等。
    • 由于finalize的存在,对象有三种状态
      • 可触及的:活着
      • 可复活的:finalize重写过并且还没有执行,因此有机会进行死亡逃脱
      • 不可触及的:直接打死

在这里插入图片描述

  • 垃圾回收(三种算法清理尸体)

    • 复制算法(常用在新生代这种回收率较高的块上):有一块是专门用来备用的,清除的时候将存活对象复制到备用上,然后清除当前使用的内存块,交换两个的块的角色
    • 标记-清除算法:挨个清理,容易产生内存碎片,维护一个空闲列表,是一种非移动式的回收算法
    • 标记-压缩清除:在标记清除的基础上加上了内存碎片的整理,而不是维护一个列表,因此是一种移动式的回收算法
  • 增量收集算法:(解决stop the world)

    每次垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。

  • 分代算法和分区算法:针对不同情况用不同的垃圾回收算法

在这里插入图片描述

  • 内存溢出OOM和内存泄漏ML

  • stop the world,所有的GC都会有这种情况

  • GC的并发和并行

    • concurrent

      • 并发:多个事情在同一段时间内同时发生:用户线程和垃圾回收线程同时执行,不会停顿用户进程
    • STW

      • 并行:多个事情在用一个时间点上同时发生:多条垃圾回收并行,用户处于等待状态
      • 串行:相对于并行,单线程运行
  • 安全点: 数量需要适中,安全点实质上是一条指令(一般选择执行时间较长的指令作为安全点)

    • 抢先式中断:控制权在安全点,把所有线程挂起,没有运行到安全点的就恢复让运行到安全点
    • 主动式中断:线程运行到这里主动询问,主动挂起
  • 安全区:是扩展的安全点,在区域的任何位置GC都是安全的,安全区的对象引用关系不会变化

    • JVM会忽略标记进入到安全区的线程,线程还可以自主运行没有被停(因为其中的每句都是安全的)
    • 但等到线程出来的时候,就检查GC是否完成,完成了就可以走,没完成就得等着(要是进入了不安全区域,而且这个线程还没有被停住,就容易让JVM和改变后的引用关系发生冲突)
  • 引用(是有引用的可触及的对象,所以不会被判定为尸体,但是不一定有引用就会存活,也分情况)

    • 强引用(有用)

      • 只要引用关系存在,JVM宁愿OOM也不会回收对象
      • 是造成内存泄漏的原因之一
      • 强引用可以直接访问目标对象
    • 软引用(有用但是非必须)

      • 即将内存溢出时,回收这些软可达对象,回收后内存还是不够才抛出异常
    • weak弱引用(非必须)

      • 不管堆空间使用情况,下一次垃圾回收器工作一定会回收掉
      • GC的优先级很低,一般很久才能拿到线程,所以也能保有很久
      • 当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间,从而起到加速系统的作用。软引用、弱引用都非常适合来保存那些可有可无的缓存数据。
    • 虚引用:虚引用不会对对象的生存造成影响(如果只有虚引用,那么和没有引用是一样的)

      • 唯一作用就是对象回收时会收到一个系统通知,可以用来跟踪对象回收时间
    • 终结器引用(并不是一种对象还被别的对象需要的信号,而是将所有需要执行finalize的对象全都加进来

      • Finalizer线程通过终结器引用找到对象,并执行finalize方法

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

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

相关文章

【产品应用】一体化伺服电机在系留无人机中的应用

一体化伺服电机是一种将电机、驱动器、编码器结合在一起的伺服系统,具有高精度控制、快速响应和高效运行等优点。系留无人机则是一种通过绳索或链条与地面设施连接的无人机,能够实现长时间的稳定悬停和空中作业。 01.设备简介 电源线牵引装置&#xff1…

【C语言】自定义类型:结构体、枚举、联合

简单不先于复杂,而是在复杂之后 文章目录 1. 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐1.7 修改默认对齐数1.8 结构体传参 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的…

fopen/fwrite/fread 对UNICODE字符写入的总结

windows对fopen函数进行了升级,可以支持指定文件的编码格式(ccs参数指定)。 例如: FILE *fp fopen("newfile.txt", "rt, ccsUTF-8"); 当以 ccs 模式打开文件时,进行读写操作的数据应为 UTF-16…

LeetCode Hot100之十:239.滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示&#xff1a; 1 < nums.length < 10^5 -10^4 < nums[i…

QT专栏1 -Qt安装教程

#本文时间2023年11月18日&#xff0c;Qt 6.6# Qt 安装简要说明&#xff1a; Qt有两个版本一个是商业版本&#xff08;收费&#xff09;&#xff0c;另一个是开源版本&#xff08;免费&#xff09;&#xff1b; 打开安装程序时&#xff0c;通过判断账号是否有公司&#xff0c;安…

centos7安装mongodb

1、下载mongodb https://www.mongodb.com/try/download/community 2、解压 3、重命名 4、创建mongodb的data、logs目录 5、启动mongodb, bin/mongod --port27017 --dbpath/data/program/mongodb/data --logpath/data/program/mongodb/logs/mongodb.log --bind_ip0.0.0.0 --f…

linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解

一 、根据端口号 查看文件的部署位置 1.1 使用查看端口号对应的进程信息 方式一 &#xff1a; 使用netstat命令 netstat -tuln | grep 端口号-t&#xff1a;显示TCP连接 -u&#xff1a;显示UDP连接 -l&#xff1a;仅显示监听状态的连接 -n&#xff1a;以数字形式显示端口…

App测试经典面试题及参考答案

最近整理了一些关于App测试的面试题。 本参照答案是本人在工作实践中总结&#xff0c;仅代表个人观点&#xff0c;如有错误&#xff0c;请谅解。 1、说一些你在测试过程中常用到的adb命名 2、APP测试与web测试的区别&#xff1f; 3、APP闪退有哪些原因造成的&#xff1f; …

人工智能轨道交通行业周刊-第65期(2023.10.30-11.19)

本期关键词&#xff1a;高铁自主创新、智慧城轨、调车司机、大模型垂直应用、大模型幻觉 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

STL简介

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解c中的STL库 > 毒鸡汤&#xff1a;路难行&a…

Redis 9 数据库

4 设置键的生存时间或过期时间 通过EXPIRE命令或者PEXPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff08;TimeToLive&#xff0c;TTL&#xff09;&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间…

记录联系ThinkPad T490扬声器无声音但插耳机有声音的解决办法

型号&#xff1a;联想ThinkPad T490&#xff0c;系统Win10 64位。 现象&#xff1a;扬声器无声音&#xff0c;插耳机有声音。且右下角小喇叭正常&#xff0c;设备管理器中驱动显示一切也都正常&#xff08;无黄色小叹号&#xff09;。 解决办法&#xff1a; 尝试了各种方法&a…