Java垃圾回收_1

一、垃圾回收

1.如何判断对象可以回收

(1)引用计数法

存在循环引用问题, Java未使用这种算法

在引用计数法中,每个对象都有一个引用计数器,记录着指向该对象的引用数量。当引用计数器为零时,表示没有任何引用指向该对象,该对象可以被释放,回收其占用的内存。
在这里插入图片描述

(2)可达性分析法

根对象:肯定不能被垃圾回收的对象

在这里插入图片描述

2.Java引用类型

1.强引用

被GC-Root引用

2.软引用

没有被强引用, 垃圾回收时内存不够,软引用被回收

3.弱引用

没有强引用,只要发生垃圾回收,弱引用会被回收掉

软引用 弱引用也占用一定的内存,对 它两进行释放,通过引用队列

在这里插入图片描述

4. 虚引用

必须配合引用队列使用,虚引用对象被垃圾回收时,虚引用 自己放入引用队列,由一个线程释放内存

在这里插入图片描述

在这里插入图片描述

5.终结器引用

Object中有finallize方法,对象重写finallize方法 ,并且没有强引用 引用它,可以被当作垃圾回收

在这里插入图片描述

在这里插入图片描述

软引用实例

在这里插入图片描述

弱引用实例在这里插入图片描述

垃圾回收算法

1.标记清除算法

标记清除算法(Mark-Sweep Algorithm)是一种常见的垃圾回收算法,用于自动管理动态分配的内存空间。其原理如下:

标记阶段(Mark):从根对象开始,通过引用链追踪,标记所有的活动对象。标记过程中,将活动对象的标记位设置为有效状态,表示这些对象是可达的,不会被回收。

清除阶段(Sweep):在标记阶段完成后,遍历整个内存空间,将未被标记的对象视为垃圾对象,将其所占用的内存空间释放,以便下次分配给新的对象使用。

优点:速度快
缺点:容易造成内存碎片
标记清除算法通过标记和清除的过程,将不再被使用的内存空间回收,以避免内存泄漏和内存碎片的问题。
然而,标记清除算法也存在一些缺点,如清除阶段会产生内存碎片,可能会导致内存分配的效率降低。

在这里插入图片描述

2.标记整理算法

在这里插入图片描述

  • 标记阶段:
    与其他垃圾回收算法一样,标记-整理算法从根对象开始遍历整个对象图,标记所有与根对象可达的对象,即被引用的对象。
  • 整理阶段:
    在整理阶段,标记-整理算法会对内存空间进行整理,将所有存活的对象移动到一端,而未标记的对象则被认为是垃圾对象。
    移动存活对象的过程中,标记-整理算法会保持存活对象之间的相对位置关系,从而确保所有存活对象在整理后仍然是连续的。
  • 回收阶段:
    在整理阶段完成后,标记-整理算法会回收并释放未标记的垃圾对象所占用的内存空间,从而实现垃圾回收。

优点:没有内存碎片
缺点:速度慢

3.复制算法

在这里插入图片描述

在这里插入图片描述

复制算法的基本思想是将内存空间划分为两个大小相等的区域,通常称为"From"空间和"To"空间。在垃圾回收过程中,首先将所有存活的对象从"From"空间复制到"To"空间中,然后对整个"From"空间进行垃圾回收,将未复制的垃圾对象清理掉。在下次垃圾回收时,交换"From"空间和"To"空间的角色,继续进行复制和回收操作。这样,"From"空间和"To"空间的角色不断交替,实现了垃圾对象的回收和内存空间的复用。

优点:不会产生碎片
缺点:需要占用双倍内存

分代回收

新生代空间不足,触发MinorGC,先标记

在这里插入图片描述
eden(伊甸园)满了,采用复制算法将存活的对象复制到TO中,幸存的对象寿命+1
在这里插入图片描述

交换From和To
在这里插入图片描述

第二次垃圾回收

在这里插入图片描述

当对象寿命超过阈值(15),晋升到老年代

在这里插入图片描述

FullGC

老年代空间不足,先尝试进行一次MinorGC ,之后空间任然不足,触发FullGC

在这里插入图片描述

在这里插入图片描述
Stop the world 暂停其他线程,进行垃圾回收

4.垃圾回收器

4.1 串行垃圾回收器

  • 单线程
  • 堆内存较小 适合个人电脑

在这里插入图片描述
新生代:复制算法
老年代: 标记 + 整理 算法

4.2 吞吐量优先

  • 多线程
  • 堆内存较大,多核CPU
  • 单位时间内,STW时间最短 0.2 0.2 = 0.4 只执行了两次

在这里插入图片描述
多个垃圾回收线程并行执行,不允许用户工作线程运行

4.3响应时间优先

  • 多线程
  • 堆内存较大,多核CPU
  • 尽可能让单次STW时间短 0.1 0.1 0.1 0.1 0.1 = 0.5

与用户线程并发执行,在工作的同时用户线程也能工作。工作代老年代

在这里插入图片描述

5. G1 垃圾回收器

在这里插入图片描述

5. 整体过程,分为三个部分

在这里插入图片描述

5.1 Young Collection

新生代内存紧张,放入幸存区

在这里插入图片描述

幸存区S有一部分晋升到老年区O

在这里插入图片描述

5.2 Young Collection + CM (并发标记)

初始标记: 标记根对象
并发标记: 从根对象触发,顺引用链找到其他标记对象(老年代占用比例达到一定阈值,进行并发标记)

在这里插入图片描述

5.3Mixed Collection混合收集

混合收集阶段优先回收垃圾最多的区,不是收集所有老年代的垃圾 。目的暂停时间短

在这里插入图片描述

5.4 FullGC

不懂

在这里插入图片描述

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

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

相关文章

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习,已经掌握了JavaSE的知识,这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种: 四类:整形、浮点…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3项目练习详细步骤(第五部分:用户模块的功能)

顶部导航栏个人信息显示 接口文档 接口请求与绑定 导航栏下拉菜单功能 路由实现 退出登录和路由跳转实现 基本资料修改 页面结构 接口文档 接口请求与绑定 修改头像 页面结构 头像回显 头像上传 接口文档 重置密码 页面结构 接口文档 接口请求与绑定 顶部导航…

自然语言处理学习路线

学习目标 NLP 系统知识(从入门到入土) 学习内容 NLP的基本流程:(待更)文本预处理(标点符号处理、繁体转简体、分词Tokenizer):(待更)词袋模型(TF…

【T+】畅捷通T+软件固定资产模块反启用

【问题描述】 畅捷通T软件,固定资产模块反启用。 【解决方法】 针对账套库执行如下脚本清除资产的所有数据, 执行前请与客户确认资产的所有数据都不要了,确认后备份账套再执行脚本,切记!!! 然后…

Flutter 中的 ChipTheme 小部件:全面指南

Flutter 中的 ChipTheme 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它提供了一套丰富的组件集合,用于构建现代化的、响应式的移动和 Web 应用。ChipTheme 是 Flutter 中一个专门用于统一设置应用中所有 Chip 组件样式的…

红外热成像观驱一体仪,夜间驱鸟新利器

夜间驱鸟是机场鸟防工作的重点和难点,但红外热成像观驱一体仪的出现解决了这个问题,它结合了红外热成像技术和激光驱鸟技术,极大地提升了夜间驱鸟工作的效率和安全性。 驱鸟技术详解: 在夜晚低能见度的环境下,红外热成…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目:https://github.com/MengYang-x/STM3F401-FOC/tree/main📍硬件电路和项目介绍,立创开源广场:https://oshwhub.com/shadow27/tai-yang-nen…

【bug】在 Windows 上安装 SDKMAN! 的完整指南

在 Windows 系统上,安装 SDKMAN! 可能会遇到一些小问题。本文将详细介绍如何解决这些问题并成功安装 SDKMAN!。 问题描述 当在 PowerShell 中运行以下命令以安装 SDKMAN! 时: curl -s get.sdkman.io | bash你可能会遇到以下错误: bash : …

前端面试题日常练-day45 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在Bootstrap中,以下哪个类用于创建一个具有响应式的导航栏? a) .navbar-responsive b) .responsive-nav c) .navbar-collapse d) .collapse-navbar 2. 哪个Bootstrap类用…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判断是thinkphp 3.2 参考官方手册:https://www.kancloud.cn/manual/thinkphp/1697 判断路由模式 URL_CASE_INSENSITIVE > true, // 默认false 表示URL区分大小写 true则表示不区分大小写URL_MODEL > 1, // URL访问模式,可选参数0、1、…

Python使用动态代理的多元应用

Python作为一种功能强大且易于学习的编程语言,在网络编程领域具有广泛的应用。当Python与动态代理技术结合时,便开启了一扇通往更多可能性的大门。以下将深入探讨Python使用动态代理可以实现的多种应用。 首先,Python结合动态代理在网络爬虫…

中文多模态InternVL-Chat-V1-5,中文理解能力强劲,8 项指标超越商业模型,性能媲美 GPT-4V

前言 近年来,多模态大型语言模型(MLLM)的快速发展,为人工智能在图像、文本等多模态信息理解和处理方面带来了前所未有的突破。然而,现有的主流多模态模型多以英文为训练语言,在中文理解和处理方面存在着明…

可用于嵌入式的解释器调研对比,及lua解释器介绍

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章: 这里是引用 ------------…

1113 钱串子的加法

idea 测试点3&#xff1a;输入的两个整数都是0测试点4.5&#xff1a;大数&#xff0c;需要用大数加法 solution1(测试点4&#xff0c;5不通过) 直接相加再转30进制 #include<iostream> #include<string> using namespace std; typedef long long ll; string a,…

linux sed命令替换文件端口

1、需求描述&#xff1a;因sed -i ‘s/旧端口/新端口/g’ 文件&#xff0c;替换会直接增加端口导致端口直接追加后面&#xff0c;因此需要修改 要求&#xff1a;2300替换为23003&#xff0c;23001替换为23004 <value>192.168.1.133</value></constructor-arg>…

RGMII接口--->(001)FPGA实现RGMII接口(一)

&#xff08;001&#xff09;FPGA实现RGMII接口(一) 1 目录 &#xff08;a&#xff09;FPGA简介 &#xff08;b&#xff09;IC简介 &#xff08;c&#xff09;Verilog简介 &#xff08;d&#xff09;FPGA实现RGMII接口(一) &#xff08;e&#xff09;结束 1 FPGA简介 &…

【科普向】【文末附gpt升级秘笈】《庆余年》凤冠之工艺探究——Blender建模与3D打印之奥秘

《庆余年》凤冠之工艺探究——Blender建模与3D打印之奥秘 一、引言 昔者&#xff0c;《庆余年》之热播&#xff0c;引发天下观众之热议。今者&#xff0c;其续作《庆余年2》之中&#xff0c;一场盛大的婚礼更是瞩目。而此婚礼之上&#xff0c;唯一之凤冠&#xff0c;竟出自一…

windows 10下conda环境目录转移

目录 一&#xff1a;背景 二&#xff1a;转移过程 三&#xff1a;环境验证 一&#xff1a;背景 最近用conda安装了几个python环境&#xff0c;随着安装包和数据的不断增大&#xff0c;发现C盘占用空间一直在增加&#xff0c;已经有十几个G了&#xff0c;系统也变的越来越慢。…