Golang Go语言中关于手动管理内存

发布于 1周前 作者 yibo5220 来自 Go语言

Golang Go语言中关于手动管理内存

为了限制程序的总内存大小,所以根据 runtime MemStats 的值来限制用于缓存的结构数组是否允许 append 。 但是带来的问题是在等待 gc 的时间内程序基本处于半睡眠状态,运行效率不高。 所以萌生了想手动管理内存的想法。首先我需要限制单个 struct 的最大内存为 4kb,然后限制[] struct 最大为 1024, 那么可以预先生成一个池

rows := 1024
cols := 4096
pool := make([][]byte, rows)
for i := 0; i < rows; i++ {
    pool[i] = make([] byte, cols)
}

这样得到一个 byte 池,然后再建立一个状态数组因维护每个坑的使用状态,把 struct 转成[]byte 从 pool 存入 /取出
你们觉得行不行。。


更多关于Golang Go语言中关于手动管理内存的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

可以 但是为什么不用 c 语言呢

更多关于Golang Go语言中关于手动管理内存的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


因为有现成的车,只要从自吸加个电池组变成混动就好了。但是要从头造一个涡轮加速,那工作量就太大了

0.0 你是说整个重写用 c 还是分配内存这一块用 c …

随便讲讲。

要关闭 gc 的话环境变量 GOGC=off 就可以了

c++或者 rust 走起啊。

用 GC 语言来模拟内存池怪怪的。最好是直接调用 C 语言写的内存池,自己释放和申请内存。

汽油车加个电池组就能变混动???混动的技术难度比纯油或纯电复杂得多好吗。

我之前也觉得 GC 语言搞内存池很奇怪,直到前段时间看到 v2ray 里是这么搞的,不过我还没仔细看
希望这个对你有帮助 https://github.com/v2ray/v2ray-core/blob/master/common/bytespool/pool.go

连 resource pool 的通用的轮子都没有,要自己写 pool 这么惨?

在Golang(又称Go语言)中,虽然垃圾回收器(GC)负责大多数内存管理工作,但在某些情况下,开发者可能需要手动管理内存,尤其是在性能调优或处理特殊资源时。以下是一些关于手动管理内存的关键点:

  1. 逃逸分析:Go编译器通过逃逸分析来决定变量是否应该分配在堆上还是栈上。理解逃逸分析有助于预测GC的行为,从而优化内存使用。

  2. 使用unsafeunsafe包提供了直接操作内存的功能,如指针运算和类型转换。虽然强大,但使用不当可能导致未定义行为,应谨慎使用。

  3. 显式释放资源:对于文件句柄、网络连接等系统资源,即使Go有垃圾回收机制,也应使用defer语句显式关闭或释放,以避免资源泄漏。

  4. 池化技术:对于频繁分配和释放的小对象,可以考虑使用对象池来减少GC压力和提高性能。通过重用对象,可以减少内存分配和回收的开销。

  5. 调优GC:虽然大多数情况下不需要,但在特定情况下,可以通过设置环境变量(如GOGC)来调整GC的行为,以优化性能。

总之,在Go语言中,虽然大多数情况下可以依赖垃圾回收器来管理内存,但在特定场景下,理解并适当使用手动内存管理技术可以显著提升程序的性能和资源利用率。务必在充分理解其原理和潜在风险的前提下进行尝试。

回到顶部