业务中有这样一个struct:

type bizData struct{
A uint64
B uint64
C int32
D uint32
}

虽然没有实测,但我猜测这样的对齐方式,这个struct占24字节。

业务中用一个map指向这些对象: map[uint64]*bizData

这样的存储对象,一个容器开启10GB内存,最多存储60万左右的对象,容器内存就爆了。

于是自己实现一个简易的内存池:mempool.go

package mempool

//实现一个按块扩展的内存池

type memPool struct {
datas [][]bizData
freeNode chan uint32
countOfBlock int
} //NewMemPool 构造内存池对象
func NewMemPool(countOfBlock int) *memPool {
out := &memPool{
datas: [][]bizData{make([]bizData, countOfBlock)},
freeNode: make(chan uint32, countOfBlock),
countOfBlock: countOfBlock,
}
for i := 0; i < countOfBlock; i++ {
out.freeNode <- uint32(i)
}
return out
} func (pool *memPool) moreBlock() {
pool.datas = append(pool.datas, make([]bizData, pool.countOfBlock))
ch := make(chan uint32, len(pool.datas)*pool.countOfBlock)
close(pool.freeNode)
for item := range pool.freeNode {
ch <- item
}
start := (len(pool.datas) - 1) * pool.countOfBlock
for i := 0; i < pool.countOfBlock; i++ {
ch <- uint32(start + i)
}
pool.freeNode = ch
} func (pool *memPool) Get() uint32 {
if len(pool.freeNode) == 0 {
pool.moreBlock()
}
select {
case idx := <-pool.freeNode:
return idx
default:
panic("impossible")
}
} func (pool *memPool) Put(idx uint32) {
pool.freeNode <- idx
} func (pool *memPool) Item(idx uint32) *bizData {
blockIdx := int(idx) / pool.countOfBlock
loc := int(idx) % pool.countOfBlock
return &(pool.datas[blockIdx][loc])
}

然后把对象的引用方式修改为: map[uint64]uint32 //值映射数据块的下标

使用上面的内存池后,分配250万小对象,进程内存始终未超过600mb!!

so, 大量小对象的情况下,自己实现内存池更好!

【笔记】对golang的大量小对象的管理真的是无语了……的更多相关文章

  1. 读书笔记 effective c++ Item 13 用对象来管理资源

    1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...

  2. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  3. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  4. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  5. Java小对象的解决之道——对象池(Object Pool)的设计与应用

    一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...

  6. java并发编程笔记(四)——安全发布对象

    java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...

  7. [Effective Java 读书笔记] 第二章 创建和销毁对象 第五条

    第五条 避免创建不必要的对象 书中一开始举例: String s = new String("stringette"); // don't do this //应该使用下面,只会创 ...

  8. C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试

    在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...

  9. (笔记)Linux内核学习(九)之内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

随机推荐

  1. CF53C Little Frog 题解

    Content 有一只小青蛙想游历 \(n\) 块土堆,它现在在 \(1\) 号土堆上,每次可以跳跃任意距离到达另外的一个土堆.它想让每次跳跃的距离都不相等,试找到这样的一个方案. 数据范围:\(1\ ...

  2. LuoguP7593 凑数 题解

    Content 给定 \(n\) 个整数 \(1,2,\dots,n\),请问是否能从这 \(n\) 个数中恰好选 \(k\) 个数,使得这 \(k\) 个数的和为 \(s\). 数据范围:\(t\) ...

  3. JAVA调用阿里云短信接口

    官方文档:https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.626.2cef6220yxh5l7 jar ...

  4. JAVAWEB项目处理XSS漏洞攻击处理方案

    对页面传入的参数值进行过滤,过滤方法如下 public static String xssEncode(String s) { if (s == null || s.equals("&quo ...

  5. JAVA整合Redis使用redisTemplate清除库中的所有键值对数据

    JAVA整合Redis使用redisTemplate清除库中的所有键值对数据,清除所有缓存数据 Set<String> keys = redisTemplate.keys("*& ...

  6. c++11之std::bind简单使用

    note 更多用法,请参考: cppreference 用的少,容易忘. 我的理解 类似延迟计算. 比如,回调函数,将回调函数传入后,回调函数不一定马上被调用. 它是一个模板类,调用后将生成一个新的调 ...

  7. 【LeetCode】1166. Design File System 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 目录树 日期 题目地址https://leetc ...

  8. 【LeetCode】733. Flood Fill 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:BFS 日期 题目地址:ht ...

  9. Vue的安装及使用(Vue的三种安装使用方式)

    vue是一个JavaMVVM库,是一套用于构建用户界面的渐进式框架,是初创项目的首选前端框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计.它是轻量级的,它有很多独立的功能或库,我们 ...

  10. spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...