【笔记】对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位系统:页 ...
随机推荐
- 常用DBhelper封装方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 有个奇怪的问题,配置成/system/index,jsp页面时没有经过过滤器进行拦截,而配置成redirectAction时是可以直接跳转刀片loginJsp.action
有个奇怪的问题,配置成/system/index,jsp页面时没有经过过滤器进行拦截,而配置成redirectAction时是可以直接跳转刀片loginJsp.action 但是我直接访问/syste ...
- C++使用C语言库函数创建文件夹
概述 本文演示环境: win10 + vs2017 头文件 #include <io.h> #include <direct.h> 函数 下面的函数,从左至右依次检查文件夹是否 ...
- 【LeetCode】1102. Path With Maximum Minimum Value 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+并查集 优先级队列 日期 题目地址:https: ...
- 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 前序遍历 日期 题目地址:https://leetc ...
- 【LeetCode】932. Beautiful Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 构造法 递归 相似题目 参考资料 日期 题目地址:h ...
- 【剑指Offer】二叉树的深度 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://www.nowcoder.co ...
- 【LeetCode】849. Maximize Distance to Closest Person 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 1382 - The Queue
1382 - The Queue PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB On som ...
- 【计组】《计算机组成与体系结构性能设计》William Stallings 第2部分 计算机系统 第3章 计算机功能和互连的顶层视图
关键词 address bus 地址总线 asynchronous timing 异步时序 bus 总线 bus arbitration 总线仲裁 bus width 总线宽度 centralized ...