GO内存管理

内存管理

内存管理

xxx

内存分配

内存分配有两种方式:栈分配和堆分配- 栈分配是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放
- 堆分配则是通过 new 或者 make 函数动态分配内存,需要GC释放编译器会自动选择在栈上还是在堆上,来分配局部变量的存储空间
如果一个局部变量在函数返回后仍然被使用,这个变量会从heap,而不是stack中分配内存

内存逃逸

原本应该在栈上分配的内存被分配到了堆上
  • 场景
- 变量的生命周期超出了其作用域
- 大对象的分配
- 闭包引用
-interface 类型上调用方法
- 在 slice 或 map 中存储指针
  • 检测
go build -gcflags -m main.go 
  • 优化策略
- 严格限制变量的作用域
- 对于小型的数据,使用传值而不是传指针
- 避免使用长度不固定的slice切片

内存泄漏

- 在程序执行过程中,已不再使用的内存空间没有被及时释放或者释放时出现了错误
- 导致这些内存无法被使用,直到程序结束这些内存才被释放
  • 分类
// 分为暂时性内存泄漏和永久性内存泄漏
- 暂时性内存泄漏- 获取长字符串中的一段导致长字符串未释放- 获取长slice中的一段导致长slice未释放- defer 导致的内存泄漏
- 永久性内存泄漏- goroutine 泄漏导致内存泄漏- 定时器使用不当,time.Ticker未关闭导致内存泄漏- 不正确地使用终结器(Finalizers)导致内存泄漏
goroutine泄漏导致内存泄漏
  • 本质
goroutine 阻塞,无法继续向下执行,导致此 goroutine 关联的内存都无法释放,进一步造成内存泄漏
  • 两种方式造成内存泄漏:
1. goroutine本身的栈所占用的空间造成内存泄漏
2. goroutine中的变量所占用的堆内存导致堆内存泄漏
  • 泄漏的场景
- channel 阻塞
- select操作在所有case上都阻塞,造成内存泄漏
- 互斥锁没有释放,互斥锁死锁
- 申请过多的goroutine来不及释放
- 在 goroutine 里调用的一些资源,没有 close
  • 发现和定位
1.go pprof获取goroutine profile文件
2.top、traces、list定位内存泄漏的原因
判断依据:在节点正常运行的情况下,隔一段时间获取goroutine的数量- 如果后面获取的那次,某些goroutine比前一次多,- 如果多获取几次,是持续增长的- 就极有可能是goroutine泄漏
不正当使用内存场景
  • 大数组作为参数导致短期内内存激增
  • goroutine阻塞拥挤等待,浪费内存

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

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

相关文章

Java中的Checked Exception和Unchecked Exception的区别

在Java中,异常分为两大类:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。 已检查异常是在编译时必须被捕获或声明的异常。换句话说,如果你的方法可能会抛出某个已检查异常&…

封装uview2的picker组件(uniapp)

1.源码 <template><view><view :class"[getPickerName ? : is-placeholder]" click"onShowPicker">{{ getPickerName || placeholder }}</view><u-picker v-if"showStatus" :show"show" :columns"…

力扣1504.统计全1子矩形

力扣1504.统计全1子矩形 开一个二维数组存每个点从它本身开始向左有多少连续的1 遍历矩形右下角(i,j) 再遍历行k in i每一行的矩形数量 minx min(minx,left(k,j)) class Solution {public:int numSubmat(vector<vector<int>>& mat) {int n mat.size();int…

Kubernetes面试整理-如何收集和管理Pod日志?

在 Kubernetes 中,收集和管理 Pod 日志是确保应用程序健康运行和进行故障排除的重要步骤。以下是几种常用的方法和工具,用于收集和管理 Pod 日志: 1. 使用 kubectl logs kubectl logs 命令是最简单的查看 Pod 日志的方法。它允许您查看单个容器的日志。 查看单个容器的日志:…

韩顺平0基础学Java——第33天

p653-674 坦克大战 继续上回游戏 将每个敌人的信息&#xff0c;恢复成Node对象&#xff0c;放进Vector里面。 播放音乐 使用一个播放音乐的类。 第二阶段结束了 网络编程 相关概念 &#xff08;权当是复习计网了&#xff09; 网络 1.概念:两台或多台设备通过一定物理设备连…

龙芯久久派到手开机测试

今天刚拿到龙芯久久派&#xff0c;没看到文档&#xff0c;只有视频&#xff0c;我来写个博客&#xff0c;做个记录&#xff0c;免得以后忘记 1.连接usb转ttl串口与龙芯久久派&#xff0c;如图所示。 2.将usb转串口接到电脑USB口 也就是这个接电脑上 3.打开串口调试助手或Secu…

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式4599张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4599 标注数量(xml文件个数)&#xff1a;4599 标注数量(txt文件个数)&#xff1a;4599 标注…

【面试系列】云计算工程师 高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

使用Spring Boot实现RESTful API

使用Spring Boot实现RESTful API 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot框架实现RESTful API&#xff0c;这是现…

Android 11.0 修改系统显示大小导航栏消失

Android 11.0 修改系统显示大小导航栏消失 1.显示大小设置为大时&#xff0c;导航栏图标不显示。 设置为大&#xff0c;较大&#xff0c;最大时&#xff0c;导航栏图标不显示。 2.开始怀疑是导航栏被隐藏了&#xff0c;各种折腾无效。 3.发现&#xff1a; frameworks/base/pa…

无人机的弱点和限制

1.电池和续航能力&#xff1a; 续航时间短&#xff1a;大多数无人机依赖锂电池供电&#xff0c;续航时间通常在30分钟至1小时之间&#xff0c;限制了其长时间任务的执行能力。 能量密度低&#xff1a;现有电池技术的能量密度无法满足长时间飞行需求&#xff0c;需要突破性的发…

62.ThreadLocal在数据库Connection对象上的应用

JDBC操作数据库Connection JDBC操作数据库的过程中,为了保证所有的操作在一个事务中: 1.使用的连接必须是同一个:service层开启事务的connection需要跟dao层访问数据库的connection保持一致。 2.线程并发情况下,每个线程只能操作各自的connection。每个线程的connection对…

MySQL中SQL语句的执行过程详解

1. 客户端连接和请求 客户端连接 在MySQL中&#xff0c;客户端连接和请求过程是执行SQL语句的第一步。该步骤主要涉及客户端如何连接到MySQL服务器&#xff0c;以及如何维护和管理客户端与服务器之间的会话。 客户端连接&#xff1a; 连接器&#xff08;Connector&#xff09…

amis源码 更新组件数据域的几种方法

更新组件数据域的几种方法&#xff1a; 默认都是合并数据&#xff0c;非覆盖(指定replace为true的才是覆盖)&#xff1a; const comp amisScoped.getComponentById(id);//或者getComponentByName(name) 1.comp.setData(values, replace); //更新多个值values&#xff0c; r…

Linux多进程和多线程(一)

进程 进程的概念 进程&#xff08;Process&#xff09;是操作系统对一个正在运行的程序的一种抽象。它是系统运行程序的最小单位&#xff0c;是资源分配和调度的基本单位。 进程的特点如下 进程是⼀个独⽴的可调度的活动, 由操作系统进⾏统⼀调度, 相应的任务会被调度到cpu …

Python逻辑控制语句 之 判断语句--if else结构

1.if else 的介绍 if else &#xff1a;如果 ... 否则 .... 2.if else 的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码 else: 判断条件不成立&#xff0c;执行的代码 &#xff08;1&#xff09;else 是关键字, 后⾯需要 冒号 &#xff08;2&#xff09;存在冒号…

昇思25天学习打卡营第6天|函数式自动微分

今天学习自动微分。 神经网络训练有点类似于负反馈调节&#xff0c;所以需要用到微分运算。 用来计算获得损失和梯度。 求导求微分等等这些操作对于离开数学很久的人是很困难的一个天堑&#xff0c;幸好mindspore框架给我们提供了一系列简单的API屏蔽这些运算过程&#xff0c;…

【BILIBILIAS】安卓端B站视频下载神器,4K画质轻松get!

B站视频下载的方法之前给大家分享过网页版和电脑版的工具《太猛了&#xff01;B站视频下载方法&#xff01;三端通用&#xff01;》&#xff0c;但是手机上的工具没有给大家分享过。今天今天就给大家分享一个安卓端的B站视频下载神器——BILIBILIAS&#xff0c;可以轻松下载4K画…

【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程

目录 0 引言1 多人游戏会话1.1 Why&#xff1f;为什么要有这个1.2 How&#xff1f;怎么使用&#xff1f; 2 加入游戏会话的流程总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 网络】在网络…

Linux部署Java项目至云服务器

文章目录 1.服务器环境2.发布部署过程2.1 执行SQL脚本2.2 修改代码中数据源的配置2.3 修改配置中的日志级别与日志文件路径2.4 打包Java程序2.5 上传到服务器2.6 后台运行2.7 服务器开放对应的端口2.8 访问验证 1.服务器环境 要将我们的项目部署到云服务器上我们就需要先有一个…