加入收藏 | 设为首页 | 会员中心 | 我要投稿 南昌站长网 (https://www.0791zz.cn/)- 终端安全、安全管理、数据治理、图像分析、大数据!
当前位置: 首页 > 站长资讯 > 动态 > 正文

看看人家那后端API接口写得

发布时间:2021-02-05 14:51:28 所属栏目:动态 来源:互联网
导读:最高位的1GB是linux内核空间,用户代码不能写,否则触发段错误。下面的3GB是进程使用的内存。 Kernel space:linux内核空间内存 Stack:进程栈空间,程序运行时使用。它向下增长,系统自动管理 Memory Mapping Segment:内存映射区,通过mmap系统调用,将文

最高位的1GB是linux内核空间,用户代码不能写,否则触发段错误。下面的3GB是进程使用的内存。

  • Kernel space:linux内核空间内存
  • Stack:进程栈空间,程序运行时使用。它向下增长,系统自动管理
  • Memory Mapping Segment:内存映射区,通过mmap系统调用,将文件映射到进程的地址空间,或者匿名映射。
  • Heap:堆空间。这个就是程序里动态分配的空间。linux下使用malloc调用扩展(用brk/sbrk扩展内存空间),free函数释放(也就是缩减内存空间)
  • BSS段:包含未初始化的静态变量和全局变量
  • Data段:代码里已初始化的静态变量、全局变量
  • Text段:代码段,进程的可执行文件

二、内存管理中的一些常见问题

  1. 未能释放已经不再使用的内存 - 内存泄漏
  2. 指向不可用的内存指针 - 野指针
  3. 指针所指向的对象已经被回收了,但是指向该对象的指针仍旧指向已经回收的内存地址 - 悬挂指针
  4. 分配或释放内存太快或者太慢
  5. 分配内存大小不合理,造成内存碎片问题
  6. 内存碎片问题

三、TCMalloc

可以查看前面的文章TCMalloc内存分配简析,TCMalloc内存分配器的原理和golang内存分配器原理相近,所以理解了TCMalloc,golang内存分配原理也就理解大半,不过golang对它也有一些改动。

四、golang内存

4.1 golang怎么解决常见内存问题

golang是怎么解决 二 的内存管理中的常见问题的呢?

针对上面的1、2、3 这三种问题,golang使用自动垃圾回收机制,一般情况下,都不使用指针运算(要运算用unsafe包),很少的指针使用。当然,内存泄漏问题不能完全根除,但是可以解决一大部分问题。

针对下面的4、5、6 这三种问题,golang采用了多级缓存,预分配的方法,来加快内存分配和释放回收,尽量减少内存碎片。详见TCMalloc内存分配简析 。

4.2 为什么要重新写一个内存分配器

内核已经有一个malloc的内存分配器,为什么还有重写一个内存分配器?

可以看到,malloc是一个很悠久的内存分配器,但是随着时代的发展,多核多线程已经普及,为了更好的应用多线程,提高程序效率,以及改进内存碎片,所以重新写了一个内存分配器。从这里TCMalloc内存分配简析 可以看出TCMaloc的优点,它将内存划分为多级别,减少锁的开销。而且每个线程的缓存又分开了多个小的对象,以减少内存碎片。等等优化改进。

所以go内存分配也继承了这些优点。go还有一个原因,那就是go还有GC,需要配合内存的垃圾回收。

4.3 内存管理到底管理哪个区域

从上面的进程内存布局图,可以看出一个进程的内存划分了好多不同的区域,而内存管理主要管理的就是Stack和Heap,其中Stack (栈)区主要由编译器和系统管理,程序语言主要管理Heap(堆)。而且这里的进程内存指的是虚拟内存。

4.4 golang内存中的概念

golang内存分配的基本思想来自TCMalloc,所以go内存分配中的几个概念与TCMalloc很相似,可以看看TCMalloc 中的概念 。

(编辑:南昌站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读