【笔记】对golang的大量小对象的管理真的是无语了……
业务中有这样一个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的大量小对象的管理真的是无语了……的更多相关文章
- 读书笔记 effective c++ Item 13 用对象来管理资源
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...
- golang学习笔记14 golang substring 截取字符串
golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...
- java并发编程笔记(四)——安全发布对象
java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第五条
第五条 避免创建不必要的对象 书中一开始举例: String s = new String("stringette"); // don't do this //应该使用下面,只会创 ...
- C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...
- (笔记)Linux内核学习(九)之内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
随机推荐
- Hibernate 批量update数据时,怎么样做可以回滚,
Hibernate 批量update数据时,怎么样做可以回滚, 1.serviceManagerDaoImpl代码里对异常不进行try,catch抛出, 2.或者抛出throw new Runtime ...
- SpringBoot内嵌ftp服务
引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.ftpserver/ftpserver-core --> <depen ...
- 【九度OJ】题目1198:a+b 解题报告
[九度OJ]题目1198:a+b 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1198 题目描述: 实现一个加法器,使其能 ...
- 【LeetCode】986. Interval List Intersections 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 题目地址:https://leetco ...
- 【LeetCode】219. Contains Duplicate II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用set 使用字典 日期 题目地址:https:/ ...
- 【LeetCode】208. Implement Trie (Prefix Tree) 实现 Trie (前缀树)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,Trie, 前缀树,字典树,20 ...
- 【剑指Offer】10- II. 青蛙跳台阶问题 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 动态规划 日期 题目地址:https: ...
- Codeforces Round #358 (Div. 2) C. Alyona and the Tree
C. Alyona and the Tree time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Deep Linear Networks with Arbitrary Loss: All Local Minima Are Global
目录 问题 假设和重要结果 证明 注 Laurent T, Von Brecht J H. Deep linear networks with arbitrary loss: All local mi ...
- 取代 Maven?这款项目构建工具性能提升 300%
在 GitHub 上闲逛的时候,发现了一个新的项目:maven-mvnd,持续霸占 GitHub trending 榜单好几天了. maven-mvnd,可以读作 Maven Daemon,译作 Ma ...