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

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

kali自带--DNS路由--信息搜集

目录 DNS信息搜集 whois fierce dnsenum 路由信息搜集 DNS信息搜集 whois whois 域名 --域名注册的时候填的基本信息. fierce 域名的多级域名? 搜索引擎-谷歌搜索 whois 枚举/递归查询 dnsenum dnsenum 域名 -f 文件名 路由信息搜集 icmp经常ping不通--所以kali出了个tcp的…

Maven简介和快速入门

1.1Maven介绍 Maven – Introduction (apache.org) Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)。 1.2Maven主要作用 1.依赖管理: Maven 可以管理项目的依赖,包括自动下载所需依赖库、…

【vscode免密连接云服务器】

目录: 前言1.1 生成 SSH 密钥对1.2 将公钥复制到远程服务器1.3配置remote ssh 插件信息 总结 前言 剑指offer:一年又120天 1.1 生成 SSH 密钥对 在本地cmd命令窗口执行: ssh-keygen -t rsa会提示你设置生成密钥的文件、密码等等,可以一路回…

数据资产价值如何评估?一文详解如何构建数据资产评估的综合框架

数据资产,如同其构成的数据本身,具备物理、存在和信息三重属性。数据资产的物理属性体现在其对存储空间的占用;其存在属性则体现在数据的可读取性上,若数据无法读取,则其作为资产的价值便无从体现。这两个属性共同构成…

IP地址在字符串形式、数字形式和byte数组中的转换

IP地址 ip地址,我们以ipv4为例,字符串形式为:“192.168.0.1”,可以转换成dword类型的数据: on key a {char ipv4AddrStr[16] = "192.168.0.1";//16进制:c0.a8.0.1dword ipv4AddrNum;ipv4AddrNum = ipGetAddressAsNumber(ipv4AddrStr);write("ipv4AddrNu…

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码📀 文章目录 Qt-qrencode开发-生成二维码📀[toc]1、概述📸2、实现效果💽3、编译qrencode🔍4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…

【Unity知识点详解】Addressables的资源加载

今天来简单介绍一下Addressables&#xff0c;并介绍一下如何通过AssetName加载单个资源、如何通过Label加载多个资源、以及如何通过List<string>加载多个资源。由于Addressables的资源加载均为异步加载&#xff0c;所以今天给大家介绍如何使用StartCoroutine、如何使用As…

WHAT - 用户登录系列(二)- 单点登录 SSO

目录 一、认证机制1.1 基于会话的认证&#xff08;Session-based Authentication&#xff09;1. 介绍2. 基本流程 1.2 JSON Web Tokens (JWT)1. 介绍2. jwt 组成3. 基本流程4. 阻止列表5. 刷新令牌 二、单点登录&#xff1a;SSO2.1 单系统登录2.2 SSO 介绍2.3 SSO 登录2.4 SSO …

arcgis api for javascript点击获取要素错乱的问题

今天帮同事看了一个前端地图点击的问题&#xff1a;点击时总会获取到周边的图元&#xff0c;即使我点击线的周围&#xff0c;也是能获取到的&#xff0c;除非离得特别远。 地图组件用的是arcgis api, 图层类是grahicslayer,要素类型是线。这是添加图元的代码&#xff1a; grap…

STM32高级控制定时器之输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…

基于ELK的日志管理【开发实践】

文章目录 一、ELK简介1.1 ELK的作用与应用1.2 ELK的组成1.3 Elasticsearch1.4 Logstash1.5 Kibana1.6 ELK架构简述1.7 基础知识1.7.1 数据格式1.7.2 正排索引和倒排索引1.7.3 全文搜索 二、ES入门---基于HTTP的使用方式&#xff08;了解&#xff09;2.1 索引操作2.1.1 创建索引…

探索无限可能:API平台引领数据驱动的新时代

在数字化浪潮的推动下&#xff0c;数据已成为推动商业创新和增长的核心动力。然而&#xff0c;数据的获取、整合和应用并非易事&#xff0c;需要跨越技术、安全和效率等多重挑战。幸运的是&#xff0c;API&#xff08;应用程序接口&#xff09;平台的出现&#xff0c;为我们打开…

docker 安装mysql,redis,rabbitmq

文章目录 docker 安装ngnix&#xff0c;mysql,redis,rabbitmq安装docker1.安装下载docker-ce源命令2.安装docker3.查看版本4.查看docker状态5.启动docker6.测试安装ngnix 安装mysql8.0.361.拉取mysql镜像2.安装mysql8 安装redis1.拉取redis7.0.11镜像2.安装redis3.进入容器内部…

159.二叉树:二叉树的层平均值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

mybatisPlus3.5.1有个奇葩bug的解决方法

mybatisPlus3.5.1有个奇葩bug的解决方法 文章目录 1.啥bug&#xff1f;1.1mybatisPlus官网及GitHub项目地址1.2 bug问题 2.解决方法2.1根据报错修改表中字段2.2 升级JSqlParser依赖的版本2.3升级mybatisPlus的版本 3.mysql关键字大全4.总结 1.啥bug&#xff1f; 1.1mybatisPlu…

上传RKP 证书签名请求息上传到 Google 的后端服务器

上传证书签名请求 1.准备环境&#xff1a;OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1&#xff1a;通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…

软件测试可发现所有bug吗?有什么样的原则和目的?

在今天的高度数字化时代&#xff0c;软件测试的重要性不可忽视。这是一种系统性的过程&#xff0c;通过对软件系统进行评估和验证&#xff0c;以确定其是否满足预期要求。在软件开发的各个阶段&#xff0c;软件测试都扮演着至关重要的角色。它涉及到软件功能、性能、安全性等多…

基于Spring Boot框架的分页查询和文件上传

分页查询 分析 要想从数据库中进行分页查询&#xff0c;我们要使用LIMIT关键字&#xff0c;格式为&#xff1a;limit 开始索引 每页显示的条数 假设一页想展示10条数据 查询第1页数据的SQL语句是&#xff1a; select * from emp limit 0,10; 查询第2页数据的SQL语句是&…

【推荐】用scss循环zoom缩放比例,解决可视化大屏在不同分辨率屏幕下的适配问题

方法1&#xff1a; 指定几种常规屏幕宽度&#xff08;用这种方式就必须要强制用户全屏查看页面&#xff0c;在固定的宽度下才能达到比较不错的显示效果&#xff09; // 适配不同分辨率的页面---------------------------------------- html {overflow: hidden;width: 1920px;…

光电耦合器:航天航空领域的先进连接技术

光电耦合器作为一种关键的电子连接器&#xff0c;在航天航空领域扮演着重要角色。本文将深入探讨光电耦合器在航天航空领域的应用及其技术特点。 光电耦合器在航天航空领域的应用 光电耦合器作为一种高可靠性、高速传输、抗干扰能力强的连接器&#xff0c;在航天航空领域有着广…