Go栈内存不足逃逸分析
栈内存不足逃逸到堆内存,但是到底达到多大的内存时才会发生逃逸呢?
结论:当栈内单个对象大小超过64KB,则会发生内存逃逸。
栈内存不足逃逸到堆内存的场景分析如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364type student struct { name string // 16byte}func stackSpace() { // 动态大小,发生逃逸 length := 10 space1 := make([]int, length) for i := 0; i < len(space1); i++ { space1[i] = i } len1 := unsafe.Sizeof(space1) fmt.Println("space1 length:" ...
Go栈内存管理
栈内存栈区的内存由编译器自动进行分配和释放,栈区中存储着函数的参数以及局部变量,它们会随着函数的创建而创建,函数的返回而销毁。
每个goroutine都维护着一个自己的栈区,这个栈区只能自己使用不能被其他goroutine使用。栈区的初始大小是2KB.
栈内存空间、结构和初始大小经过了几个版本的更迭
v1.0 ~ v1.1 : 最小栈内存空间为4KB;
v1.2 : 将最小栈内存提升到了8KB;
v1.3 : 使用连续栈替换之前版本的分段栈;
v1.4 ~ v1.19 : 将最小栈内存降低到了2KB;
栈结构经过了分段栈到连续栈的发展过程,介绍如下。
分段栈随着goroutine调用的函数层级的深入或者局部变量需要的越来越多时,运行时会调用runtime.morestack和runtime.newstack 创建一个新的栈空间,这些栈空间是不连续的,但是当前goroutine的多个栈空间会以双向链表的形式串联起来,运行时会通过指针找到连续的栈片段。 如下图所示。
优点:按需为当前goroutine分配内存并且及时减少内存的占用。
缺点:如果当前goroutine的栈几乎充满,那 ...
十分钟带你入门向量检索技术
1. 向量检索介绍1.1 概念介绍随着互联网的不断发展,产生了各种各样的海量数据,比如图片、文本、视频和语音等非结构化数据,这些数据可以通过人工智能技术提取出特征向量,然后通过对这些特征向量的计算和检索来实现对非结构化数据的分析和检索,如何对非结构化的向量数据进行高效检索即为向量检索技术的核心问题。
1.2. 应用场景向量检索的应用场景非常丰富,比如:
推荐系统:广告推荐、猜你喜欢等;
图片识别:以图搜图,通过图片检索图片。具体应用如:车辆检索和商品图片检索等;
自然语言处理:基于语义的文本检索和推荐,通过文本检索近似文本;
声纹匹配,音频检索;
文件去重:通过文件指纹去除重复文件;
新药搜索;
举几个简单的例子如APP的开屏广告推荐、淘宝的以图搜图、搜索引擎的联想词推荐,虽然这些场景可以用其它技术实现,但向量检索也是一个可行的方案。
2. 距离计算向量检索的过程是计算向量之间的相似度,最后返回相似度较高的TopK向量返回,而向量相似度计算有多种方式,不同的计算方式也适用于不同的检索场景。对于浮点型向量和二值型向量有着不同的距离计算方式。
浮点型向量计算方式
内积(IP)
欧式 ...
快速入门Golang Fuzz模糊测试
介绍在 Go 1.18 中,Go 语言新增模糊测试。
Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。
在具体实现上,Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初始数据构造一些随机数据,并作为输入提供给我们的程序,然后监测程序是否出现panic、断言失败、无限循环等。这些构造出来的随机数据被称为语料(corpus)。另外Fuzz testing不是一次性执行的测试,如果不限制执行次数和执行时间,Fuzz testing会一直执行下去,因此它也是一种持续测试的技术。
当模糊测试时候,因为输入不可控,故不能精准预测输出。这也是模糊测试和常规的功能测试主要区别。
通过大量的变异数据输入,来验证函数功能是否完整,这就是模糊测试。
模糊测试的函数名以Fuzz开头,函数签名是f testing.F。
支持的数据类型
1string, []byte, int, i ...