一文大白话讲清楚内存泄漏和应对策略

一文大白话讲清楚内存泄漏和应对策略

1. 啥是内存

  • 这个相信大家都应该明白,就是计算机配给程序运行储存变量的一个存储器。我们经常会说我们运行内存是4G,8G就是这个道理,
  • 我们的程序在运行时,会创建很多的变量存储在内存中。

2. 啥叫泄露

  • 你创建一个变量,内存就给你分配一个空间,正常情况下,这个变量如果你用完了,我们就应该从内存中销毁。可以有些情况下你没销毁掉,这样内存就被占用的越来越多,这就算是内存泄漏了。
  • 那么问题来了,我怎么释放变量所占用的内存,什么时间释放

3.什么时候释放

  • 一句话,就是变量不再使用的时候
  • 那问题来了怎么知道他不在被使用了呢

3.1 标记清除

  • 当变量进入执行环境,就标记这个变量“进入环境”
  • 当变量离开环境时,标记这个变量“离开环境”

3.2 引用计数

  • 语言引擎有一张“变量引用表”,记录标量被引用的次数,如果被引用的次数是0,则说明不再使用了

3. 怎么回收内存-内存回收机制

  • 无法两种,一种你自己手动调用方法清除
  • 一种语言引擎自动回收

3.1 手动回收

  • 向C语言就属于手动回收内存
  • 上代码
char * buffer;
buffer = (char*) malloc(42);
// Do something with buffer
free(buffer);//手动释放内存

3.2自动回收

  • javascript语言具有自动回收内存的机制。
  • 垃圾收集器会定期(周期性)找出那些不在继续使⽤的变量,然后释放其内存

4. 都有自动回收机制了,为啥还会出现内存泄漏

  • 很简单,上面说了,变量不用了,才会被回收。现在内存泄露了,说明回收不了,为啥回收不了,变量被持续占用呗。
  • 那什么情况下会被持续占用呢
  1. 闭包 。不懂闭包的看我这篇文章 https://blog.csdn.net/xiaobangkeji/article/details/144705161
function bindEvent() {
 var obj = document.createElement('XXX');
 var unused = function () {
 console.log(obj, '闭包内引⽤obj obj不会被释放');
 };
 obj = null; // 解决⽅法
}
  1. 定时器的残留
var someResource = getData();
setInterval(function() {
 var node = document.getElementById('Node');
 if(node) {
 // 处理 node 和 someResource
 node.innerHTML = JSON.stringify(someResource));
 }
}, 1000);
  1. DOM元素删除操作后遗留DOM变量等
const refA = document.getElementById('refA');
document.body.removeChild(refA); // dom删除了
console.log(refA, 'refA'); // 但是还存在引⽤能console出整个div 没有被回收
refA = null;
console.log(refA, 'refA'); // 解除引⽤

5.内存泄露的应对策略

  • 少使用闭包
  • 及时删除不再使用的变量
  • 定时器及时清空
Maven是一个非常流行的项目管理构建工具,主要用于Java项目的依赖管理、构建过程自动化以及提供标准化的项目结构。简单来说就是帮助程序员更轻松地处理复杂的项目。 ### **大白话讲解 Maven 的使用** 假设你在做一个菜谱,需要很多种食材(比如盐、糖、酱油等),而你自己又懒得去买这些东西。这时候如果有一个“超级外卖平台”能帮你直接把所有你需要的东西送到家,并告诉你怎么按照步骤做这道菜就好了——那么对开发者而言,“Maven”就相当于这个“超级外卖平台”。 #### 1. **引入食材 (添加依赖)** - 假设你正在编写一个 Java 程序需要用到某个库文件(例如日志框架 `log4j`)。以前我们需要手动下载并配置这些 jar 包到工程里,但现在只需要告诉 Maven:“嘿!我想要 log4j 这个东西”,然后它会自动去互联网上找到对应的版本并放到你的项目中。 在 pom.xml 文件中加入类似下面的内容即可: ```xml <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> </dependencies> ``` #### 2. **一键打包成品(编译 & 打包)** 开发完成后通常还需要将整个应用变成可以运行的形式,也就是 `.jar`,`.war` 或其他类型的归档文件。通过命令行输入简单的指令如 `mvn clean package` ,Maven 就能够清理旧版资源、完成代码编译并且生成最终产物,省去了繁琐的人工操作流程。 #### 3. **生命周期与插件** 除了基础功能之外,Maven 支持高度自定义化的工作流阶段,每个阶段都可以挂载相应的任务或插件来扩展能力范围。常见的有验证(test),部署(deploy)等等. --- ### 示例场景 举个例子吧!如果我们想创建一个新的 Spring Boot 工程: ```bash # 使用 archtype 插件快速初始化一个 spring-boot-starter 模板 mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=my-app \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false ``` 上面这条命令将会为我们准备好一切必要的目录布局及初始设置内容! --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许先森森

爱我就打我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值