当前位置: 首页 > news >正文

【基础篇】十二、引用计数法 可达性分析算法

文章目录

  • 1、Garbage Collection
  • 2、方法区的回收
  • 3、堆对象回收
  • 4、引用计数法
  • 5、可达性分析算法
  • 6、查看GC Root对象

在这里插入图片描述

1、Garbage Collection

C/C++,无自动回收机制,对象不用时需要手动释放,否则积累导致内存泄漏:

在这里插入图片描述
Java、C#、Python、Go等支持对不再使用的对象进行回收:

在这里插入图片描述

Java引入GC机制,主要负责对上的内存进行回收,简化了对象的释放,但同时也丧失了回收的及时性,因为回收操作不再又开发者做了。

在这里插入图片描述

线程不共享的部分,随着线程的创建而创建,随着线程的死亡而销毁,不会发生内存泄漏。且栈里的每个栈帧,在方法执行完后直接弹栈并释放内存,都不用等到线程死亡。

在这里插入图片描述
添加JVM参数:

-verbose:gc

可查看回收日志

2、方法区的回收

即回收不再使用的类,对应类生命周期里的卸载阶段。类A被卸载,需同时满足

  • 类的所有实例对象全被回收,堆中再无它的对象或子类的对象
  • 加载类A的类加载器被回收
  • 类A的java.lang.Class对象没有任何地方在引用
URLClassLoader loader = new URLClassLoader(new URL[] {new URL("file:D:\\lib\\")});
Class<?> clazz = loader.loadClass("com.plat.domain.A");
Object a = clazz.newInstance();
a = null;
clazz = null;
loader = null;

Demo代码如下,循环体中创建的变量,一轮结束后自动没用,不用重复 o = null

public class Demo2 {public static void main(String[] args) {try {ArrayList<Class<?>> classes = new ArrayList<>();ArrayList<ClassLoader> loaders = new ArrayList<>();ArrayList<Object> objs = new ArrayList<>();while (true) {//URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("file:D:\\tmp\\")});BreakClassLoader1 classLoader = new BreakClassLoader1();  //自定义类加载器classLoader.setBasePath("D:\\springboot\\jvm\\target\\classes\\");Class<?> clazz = classLoader.loadClass("com.plat.app.Demo1");Object o = clazz.newInstance();//循环体中创建的变量,一轮结束后自动没用,不用重复 o = null 、clazz = null 、classLoader = null/*打开这里的任意一句,就有一个对应的对象被引用,类卸载就会失败objs.add(o);loaders.add(classLoader);classes.add(clazz);*///手动触发一次垃圾回收,但不是立即//是对JVM的请求,具体是否回收JVM自行决断System.gc();}} catch (Exception e) {e.printStackTrace();}}}public class Demo1  {static{System.out.println("类A被加载");}
}

添加JVM参数:

//运行过程中打印类的加载信息
-XX:+TraceClassLoading   //类被卸载的时候打印一句日志
-XX:+TraceClassUnloading  

运行:

在这里插入图片描述

但其实类的卸载不常见,因为自定义类的累加载器对象还在,热部署中用的多:

在这里插入图片描述

3、堆对象回收

Java对象能否被回收,得看它是否还在被引用。

在这里插入图片描述
demo = null后,再无对Demo对象的引用,可回收。

在这里插入图片描述
执行:

a1 = null
b1 = null

A、B对象被回收,因为方法中无法再通过引用访问到这两个对象了。总之,判断方式:

  • 引用计数法
  • 可达性分析

4、引用计数法

即为每个对象维护一个计数器,对象被引用就+1,置为null了就-1,JVM扫描堆内存,发现数值为0则回收

A a1 = new A();
B b1 = new B():
a1.SetB(b1);

则A的计数器为1,B的计数器为2
在这里插入图片描述
优点:

  • 简单
  • 也是C++的智能指针的实现基础

缺点:

  • +1,-1的维护损耗性能
  • 循环引用时,导致计数器至少为1,对象无法被回收,内存泄漏

在这里插入图片描述

5、可达性分析算法

普通对象A,经一个引用链可以到达GC Root对象,则A不可被回收

在这里插入图片描述

  • GC Root对象即垃圾回收的根对象
  • GC Root对象一般不会被回收,且JVM持有GC Root对象的List列表

GC Root对象包括:

  • 线程对象Thread(引用线程栈帧中的方法参数、局部变量等)

在这里插入图片描述

  • 系统类加载器加载的java.lang.Class对象(引用类中的静态变量)

在这里插入图片描述

  • 监视器对象(引用synchronized锁的对象)

在这里插入图片描述

  • native本地方法调用时使用的全局对象

6、查看GC Root对象

步骤:

  • 阿尔萨斯的heapdump指令,保存堆内存快照到本地磁盘
heapdump d:/tmp/test.hprof
  • 使用MAT工具打开堆内存快照文件

在这里插入图片描述

相关文章:

【基础篇】十二、引用计数法 可达性分析算法

文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection C/C&#xff0c;无自动回收机制&#xff0c;对象不用时需要手动释放&#xff0c;否则积累导致内存泄漏&#xff1a; Java、C#、Python、…...

C语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…...

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC&#xff08;5&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全…...

2023版本QT学习记录 -11- 多线程的使用(QT的方式)

———————多线程的使用(QT方式)——————— &#x1f384;效果演示 两个线程都输出一些调试信息 &#x1f384;创建多线程的流程 &#x1f384;头文件 #include "qthread.h"&#x1f384;利用多态重写任务函数 class rlthread1 : public QThread {Q_OBJE…...

iOS苹果和Android安卓测试APP应用程序的差异

Hello大家好呀&#xff0c;我是咕噜铁蛋&#xff01;我们经常需要关注移动应用程序的测试和优化&#xff0c;以提供更好的用户体验。在移动应用开发领域&#xff0c;iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异&…...

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 790. 数的三次方根 题目难度&#xff1a;简单 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮…...

人机交互主板定制_基于MT8735安卓核心板的自助查询机方案

人机交互主板是一种商显智能终端主板&#xff0c;广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台&#xff0c;四核Cortex-A53架构…...

全志F1C100s Linux 系统编译出错:不能连接 github

环境 Ubuntu 20.04 LTS 64 位虚拟机 开发板:Lichee Pi Nano 源代码:GitHub - florpor/licheepi-nano 问题描述 该源码库使用了 git 子模块的概念,一个库中包含了 u-boot、Linux等代码库。不需要分别编译,一个 make 全搞定 编译时提示错误: >>> linux-hea…...

如何保障 MySQL 和 Redis 的数据一致性?

数据一致性问题是如何产生的&#xff1f; 数据一致性问题通常产生于数据在不同的时间点、地点或系统中存在多个副本的情况&#xff0c; 系统只存在一个副本的情况下也完全可能会产生。 设想一下&#xff0c;你在一家连锁咖啡店有一张会员卡这张会员卡可以绑定两个账号&#x…...

Leetcode 2999. Count the Number of Powerful Integers

Leetcode 2999. Count the Number of Powerful Integers 1. 解题思路2. 代码实现 题目链接&#xff1a;10034. Count the Number of Powerful Integers 1. 解题思路 这一题的话其实还是一个典型的求不大于 N N N的特殊数字个数的问题。 这道题本质上进行一下替换还是要求如…...

【Reading Notes】(2)

文章目录 FreestyleHip-hop dance and MusicProgrammerMaster Freestyle 都说人的成长有三个阶段&#xff0c;第一个阶段认为自己独一无二&#xff0c;天之骄子&#xff1b;第二个阶段发现自己原来如此渺小&#xff0c;如此普通&#xff0c;沮丧失望&#xff1b;第三阶段&#…...

【设计模式之美】SOLID 原则之一:怎么才算是单一原则、如何取舍单一原则

文章目录 一. 如何判断类的职责是否足够单一&#xff1f;二. 类的职责是否设计得越单一越好&#xff1f; 开始学习一些经典的设计原则&#xff0c;其中包括&#xff0c;SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义&#xff1a…...

# [NOIP2015 普及组] 扫雷游戏#洛谷

题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#…...

Unity中Shader的_Time精度问题

文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中&#xff0c;使用了_Time来达到UV的流动效果&#xff0c;普遍会出现一个问题。我们的UV值会随着时间一直增加&#xff08;uv值增加了&#xff0c;但是因为…...

听GPT 讲Rust源代码--compiler(15)

File: rust/compiler/rustc_arena/src/lib.rs 在Rust源代码中&#xff0c;rustc_arena/src/lib.rs文件定义了TypedArena&#xff0c;ArenaChunk&#xff0c;DroplessArena和Arena结构体&#xff0c;以及一些与内存分配和容器操作相关的函数。 cold_path<F: FnOnce,drop,new,…...

关键字联合体union的定义和使用

联合体的定义 联合体的定义和结构体相同。 联合体成员共用存储空间&#xff0c;联合体占用的空间最大长度的数据成员的长度。 union State {char sleep;char run;int suspend;double error; }state_u;以上例子&#xff0c;State表示联合体的名字&#xff0c;它相当于声明了一…...

基于GA-PSO遗传粒子群混合优化算法的VRPTW问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法&#xff08;GA&#xff09;基本原理 4.2 粒子群优化&#xff08;PSO&#xff09;基本原理 4.3 算法优化策略 5.完整程序 1.程序功能描述 VRPTW是车辆路径问题&#xff08;VR…...

【leetcode100-033】【链表】排序链表

【题干】 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 【思路】 递归版归并法链表版&#xff5e;没什么特别好说的&#xff08;非递归版归并也是可以哒&#xff0c;但是马上要考试了今天懒得写了&#xff01;打个flag在这里也许哪天想起来…...

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…...

数据库系统-甘晴void学习笔记

数据库系统笔记 计科210X 甘晴void 202108010XXX 教材&#xff1a;《数据库系统概论》第6版 &#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文章目录 数据库系统<br>笔记第一篇 基础篇1 绪论1.1数据库系统概述1.2数据模型1.3数据库系统的结构(三级模式结构…...

第4章 编码规范-4.1 命名规范

在Python中&#xff0c;变量、常量、模块、包、函数、类、对象、属性、方法和异常类都具有一定的命名规范。但是&#xff0c;这些命名规范都是通用性规范&#xff0c;而不是强制性规范&#xff0c;所以具体的命名规范还需要以开发项目的要求为主。&#xff08;1&#xff09;变量…...

Audio Pixel Studio效果惊艳集锦:10类垂直场景语音生成+分离真实案例

Audio Pixel Studio效果惊艳集锦&#xff1a;10类垂直场景语音生成分离真实案例 1. 引言&#xff1a;当声音创作变得触手可及 想象一下&#xff0c;你正在为一个短视频项目寻找合适的旁白配音&#xff0c;但预算有限&#xff0c;专业配音师的价格让你望而却步。或者&#xff…...

企业邮箱安全必看:SPF、DKIM、DMARC 三件套配置实战(附常见错误排查)

企业邮箱安全必看&#xff1a;SPF、DKIM、DMARC 三件套配置实战&#xff08;附常见错误排查&#xff09; 当一封伪造CEO签名的钓鱼邮件成功进入财务部门邮箱时&#xff0c;企业面临的不仅是数据泄露风险——根据Verizon《2023年数据泄露调查报告》&#xff0c;83%的商务邮件入侵…...

MySQL局域网远程连接测试教程

MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...

HP-Socket创新项目原型迭代记录:变更、原因与效果

HP-Socket创新项目原型迭代记录&#xff1a;变更、原因与效果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为一款高性能TCP/UDP/HTTP通信组件&#xff0c;其…...

Unsloth Docker部署详解:从零开始搭建训练环境

Unsloth Docker部署详解&#xff1a;从零开始搭建训练环境 1. 环境准备与Docker安装 1.1 系统要求检查 在开始之前&#xff0c;请确保你的系统满足以下基本要求&#xff1a; 64位Linux系统&#xff08;推荐Ubuntu 22.04&#xff09;NVIDIA显卡驱动已安装&#xff08;建议版…...

告别重复劳动:用快马生成自动化脚本,实现dify多环境一键部署与高效管理

在团队协作中&#xff0c;dify的部署工作常常成为效率瓶颈。每次新版本发布或环境迁移时&#xff0c;手动配置docker-compose文件、处理版本差异、备份数据等重复操作不仅耗时&#xff0c;还容易出错。最近尝试用InsCode(快马)平台生成自动化脚本集&#xff0c;意外发现部署效率…...

三步解锁QQ空间历史说说备份:数据留存与管理实用指南

三步解锁QQ空间历史说说备份&#xff1a;数据留存与管理实用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory QQ空间数据备份是许多用户保存青春记忆和重要记录的需求。GetQzonehist…...

别再只仿真了!手把手教你用LabVIEW+USRP-2920搭建真实无线通信链路(BPSK/QPSK调制实战)

从仿真到实战&#xff1a;LabVIEW与USRP-2920构建无线通信链路的完整指南 在通信工程领域&#xff0c;仿真与硬件实现之间往往存在一道难以逾越的鸿沟。许多工程师能够熟练使用MATLAB或LabVIEW进行通信系统仿真&#xff0c;但当面对USRP-2920这样的射频硬件时&#xff0c;却常常…...

告别重复造轮子,用快马AI一键生成高复用登录组件提升效率

在开发官网登录入口时&#xff0c;我们常常需要重复处理用户认证、表单验证、状态管理等基础逻辑。这些工作虽然不复杂&#xff0c;但每次从零开始确实会消耗不少时间。最近我发现用InsCode(快马)平台可以快速生成高质量的登录组件&#xff0c;大大提升了开发效率。 组件功能设…...