JVM之GC垃圾回收

GC垃圾回收

如何判断对象可以回收

  • 引用计数法

    如果有对象引用计数加一,没有对象引用,计数减一,如果计数为零,则回收

    但是如果存在循环引用,即A对象引用B对象,B对象引用A对象,会造成内存泄漏

  • 可达性分析算法

    1. java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象

    2. 扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收

    3. 哪些对象可以作为GG Root?

      1. System Class

        例如:Object,String,HashMap等

      2. Native Stack

      3. Thread

      4. Busy Monitor

  • 四种引用

    • 强引用:new的对象,赋值的对象

      Object obj= new Object()//new 的对象都是是强引用
      

      只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

    • 软引用

      Object obj= new Object()
      SoftReference sr = new SoftReference<>(obj);//obj就是软引用
      

      在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

    • 弱引用

      Object obj= new Object()
      WeakReference wr = newWeakReference<>(obj);//obj就是软引用
      

      弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。

    • 虚引用

      Object obj= new Object()
      PhantomReference pr = new PhantomReference <>(obj);//obj就是软引用
      

      虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

    • 终结器引用

      无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用的对象

垃圾回收算法

  • 标记清除

    标记:标记的过程其实就是,遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象。

    清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

    • 优点:速度快
    • 缺点:容易产生内存碎片
  • 标记整理

    标记:标记-整理算法从根对象开始遍历整个对象图,标记所有与根对象可达的对象,即被引用的对象。

    整理:标记-整理算法会对内存空间进行整理,将所有存活的对象移动到一端,而未标记的对象则被认为是垃圾对象。

    • 优点:没有产生"碎片"
    • 缺点:速度慢
  • 复制

    将活着的内存空间分为两块,每次只使用一块,在垃圾回收时将正在使用的内存块中的存活的对象复制到未被使用的内存块,之后清除正在使用的内存块中的所有对象,交换两块内存空间,完成垃圾回收

    • 优点:没有标记清除过程,运行高效,不会出现“碎片”问题
    • 缺点:需要两倍的内存空间

分代垃圾回收

在这里插入图片描述

老年代:存放长时间使用的对象

新生代:存放用完就可以丢弃的对象

  • MinorGC

    每次产生的新的对象在伊甸园区,如果进行了垃圾回收,那么会进行遍历所有对象,释放所有的的未被使用的对象,将使用的对象通过复制的方式,复制到幸存区S1,并进行年龄+1操作,表示该对象每次回收都没有被回收,当该值超过一个阈值时,就会将该对象放入老年代区,表示该对象可能会被长时间使用

    1. minor gc 会引发stop the world:进行垃圾回收时,会暂停其他的用户线程,等垃圾回收后,用户线程才恢复运行
    2. 当对象寿命超过阈值时,会晋升到老年区,最大寿命是15(4bit)
  • FullGC

    老年代空间都不足时,先触发Minorgc,如果之后内存空间仍然不足,则会触发FullGC,来对内存空间进行清理,STW(stop the world)的时间更长

相关VM的参数

在这里插入图片描述

大对象:如果说某个对象的大小超过了新生代内存大小,那么会将这个对象直接晋升到老年代内存块,不会发生GC回收

垃圾回收器

  • 串行

    1. 单线程的垃圾回收器

    2. 适用于堆内存较小的场景,个人电脑

    3. 打开串行垃圾回收器
      -XX:+UseSerialGC=Serial(新生代:复制算法) + SerialOld(老年代:标记整理算法)
      
    4. 在这里插入图片描述

  • 吞吐量优先(1.8默认的垃圾回收器)

    1. 多线程的垃圾回收器

    2. 适用于堆内存较大的场景,需要多核CPU的支持

    3. 让单位时间内STW的时间最短

    4. 在进行垃圾回收时会占满CPU

    5. 在这里插入图片描述

    6. -XX:parallelGCThreads=n //指定线程数量
      -XX:UseAdaptiveSizePolicy //采用自适应的大小调整策略,调整新生代的大小
      -XX:UseParallelGC //开启吞吐量优先垃圾回收器
      //ratio默认为99,此时值为0.01,只能由1%的时间用来进行垃圾回收(100min,只能有1min进行垃圾回收)
      -XX:GCTimeRatio=ratio //(公式:1/1+ratio)
      
  • 响应时间优先(基于标记清除算法)

    1. 多线程的垃圾回收器

    2. 适用于堆内存较大的场景,需要多核CPU的支持

    3. 尽可能的让单次STW的时间最短

    4. 在这里插入图片描述

    5. -XX:UseConcMarkSweepGC
      

G1(JDK9之后的默认的垃圾回收器)

定义:Garbage First

  1. 适用场景
  • 同时注重吞吐量和低延时,默认的暂时目标是200ms
  • 超大堆内存,会将堆划分为多个大小相等的Region
  • 整体上是标记+整理算法,两个区域之间是复制算法
  1. 相关参数
-XX:+UseG1GC
-XX:G1HeapRegionSize=size //设置Region的大小(1,2,4,8,16)
-XX:MaxGCPauseMillis=time //暂停目标时间
  1. G1垃圾回收阶段

    在这里插入图片描述

    3.1Young Collection(新生代)

    ​ 会STW

    ​ 会将幸存的对象,复制到幸存区,之后新生代内存满了,会将部分常用的对象复制到老年代内存

    3.2Young Collection+Concurrent Mark(新生代+并发标记)

    ​ 在YoungGC时会进行GC Root的初始标记

    ​ 老年代占用堆空间比例达到阈值时(默认为45%),进行并发标记(不会STW)

    3.3Mixed Collection(混合收集)

    ​ 会对伊甸园,新生区,老年区进行全面垃圾回收

    ​ 最终标记会STW

    ​ 拷贝存活会STW

  2. Young Collection 跨代引用

    新生代回收的跨代引用(老年代引用新生代)问题

垃圾回收调优

  1. 调优领域
    1. 内存
    2. 锁竞争
    3. cpu占用
    4. io
  2. 最快的GC是不发生GC
    1. 查看FullGC前后内存占用,考虑几个问题
      1. 是不是数据太多了
      2. 数据表示是否太臃肿
      3. 是否存在内存泄漏
  3. 新生代调优
    1. 所有new操作的内存分配非常廉价
    2. 死亡对象的回收代价为零
    3. 大部分对象用过即死
    4. minorgc时间远远低于fullgc
    5. 所以新生代内存块的大小应该设置为堆大小的1/4~1/2最佳,过大的话,会导致老年代内存过小,发生频繁 FullGC
    6. 幸存区要足够大到能保留当前活跃对象和需要晋升的对象
    7. 晋升阈值配置要得当,让长时间存活对象能尽快晋升
  4. 老年代调优(CMS)
    1. CMS的老年代内存越大越好
    2. 将老年代内存预设调至1/4~1/3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux之wsl2安装远程桌面

0. 安装后的效果 1. wsl中打开terminal并安装库 sudo apt-get purge xrdp sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies 2.优化显示 sudo sed -i s/max_bpp32/#max_bpp32\nmax_bpp128/g /etc/xrdp/xrdp.ini sudo sed -i s/xserverbp…

听说有 Hugging Face 陪伴的春节,是这样的…

辞旧迎新春节到&#xff0c;家家户户好热闹。Hugging Face 中国团队成员祝各位社区成员们新春快乐&#xff0c;万事如意&#xff01; 过去的一年我们持续看到 AI 技术的腾飞和发展&#xff0c;以及诸多机构为开源 AI 作出巨大的贡献。非常感谢将模型、数据集和应用 Demo 发布在…

寒假作业:2024/2/8

作业1&#xff1a;现有文件test.c\test1.c\main.c,编写Makkefile Makefile代码&#xff1a; CCgcc EXEa.out OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE)效果…

网络安全产品之认识准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

CTF--Web安全--SQL注入之Post-Union注入

一、手动POST注入实现绕过 账号密码检测 我们利用sqli-labs/Less-11靶场来进行演示&#xff1a; 我们可以看到一个登录页面 打开Less-11的根目录&#xff0c;我们打开页面的源代码(PHP实现)。 用VS-code打开文件&#xff0c;找到验证登录信息的代码行。 此形式的代码存在POST…

【Linux】Linux开发工具(yum、gdb、git)详解

一、软件包管理器 yum 1、什么是软件包 在 Linux 下安装软件&#xff0c;通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包&#xff08;可以理解成…

奋斗与诗意的三纲八目

人生得有一个基调、总的宗旨、指导思想、根据、根本。当人做出一个重大决定时&#xff0c;绝非偶然&#xff0c;一定是背后的宗旨在起作用。你每天起床的动力&#xff0c;是否能热情洋溢地做事&#xff0c;也是这个宗旨在起作用。念天地之悠悠独怆然而涕下&#xff0c;忧思难忘…

【数据结构】数据结构

本文是基于中国MOOC平台上&#xff0c;华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记&#xff0c;便于后期讲行系统性查阅和复习。 从个人感受而言&#xff0c;华中科技大学的课程讲解更适合初学者&#xff08;缺点在于&#xff0c;从概念到…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

Flink CDC 与 Kafka 集成:Snapshot 还是 Changelog?Upsert Kafka 还是 Kafka?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

猫头虎分享已解决Bug || 未定义的变量(Undefined Variable):ReferenceError: x is not defined

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

我希望在VS2019中使用Qt的qzipreader_p.h

操作&#xff1a; 这里添加的是我的本地路径&#xff01;大家自行对照自己的安装位置&#xff01;

个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程

个体诊所门诊电子处方开单管理系统软件&#xff0c;配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明&#xff0c;最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中&#xff0c;医师开单可谓是争分夺秒&…

VSCode如何让先前打开的文件不被自动关闭,一直保持在标签栏里(关闭预览模式)

第一次接触VSCode-Huawei IDE编辑器&#xff0c;每次打开一个新的代码文件&#xff0c;旧的代码文件都会被自动关闭&#xff08;现在才知道是因为文件默认是以预览模式打开展示的&#xff09;。 那么如何才能让先前打开的文件一直保持在标签栏里呢&#xff1f; 我们需要去设置…

Apache Paimon 文件操作

本文旨在澄清不同文件操作对文件的影响。 本页面提供具体示例和实用技巧&#xff0c;以有效地管理这些操作。此外&#xff0c;通过对提交&#xff08;commit&#xff09;和压实&#xff08;compact&#xff09;等操作的深入探讨&#xff0c;我们旨在提供有关文件创建和更新的见…

Qt未来市场洞察

跨平台开发&#xff1a;Qt作为一种跨平台的开发框架&#xff0c;具有良好的适应性和灵活性&#xff0c;未来将继续受到广泛应用。随着多设备和多平台应用的增加&#xff0c;Qt的前景在跨平台开发领域将更加广阔。 物联网应用&#xff1a;由于Qt对嵌入式系统和物联网应用的良好支…

【Spring】Spring 对 Ioc 的实现

一、Ioc 控制反转 控制反转是一种思想 控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到 OCP 原则&#xff0c;达到 DIP 原则 控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责 将对象和对象之…

Redis Centos7 安装到启动

文章目录 安装Redis启动redis查看redis状况连接redis服务端 安装Redis 1.下载scl源 yum install centos-release-scl-rh2.下载redis yum install rh-redis5-redis 3. 创建软连接 1.cd /usr/bin 2. In -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server 3. …