当前位置: 首页 > 编程日记 > 正文

Go 语言中手动内存管理

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. 在某些特殊场合, 如果能够可选地手动进行内存管理, 效果会好不少.

Go 目前的 GC 实现比较简单(mark-sweep算法), 进程的内存使用量取决于两次GC操作直接的内存申请量(不能重复使用), 而且通常GC发生在函数调用的深处, 大量对象无法立即释放. 另外, 目前Go对内存的使用是贪婪的, 一旦向系统申请了就不再释放, 进一步增大了内存消耗(但不是泄露). 整体看来, 对某些有大量临时内存的应用, 内存消耗量可能会是同样功能的C程序10倍, 甚至更多.

Beansdb 的 Proxy 是用 Go 实现的, 其中一个部署图片和歌曲的实例也面临了这个问题, 运行一段时间后内存的使用量会增长到3-4G (与访问量相关), 另一个存储小对象的实例则稳定在100M以内. Proxy 的每次请求, 都要申请一个平均 100k (10k - 3M) 的buffer用来临时存储数据, 它占了整个内存消耗的绝大部分, 如果能够手动管理这些buffer的使用, 应该能够大大降低内存消耗.

runtime 模块有 Alloc() 和 Free(), 能够申请后释放内存, 通过refect模块做类型转换后能够给buffer使用. 但是它申请和释放的内存也是有GC统一管理的, 一旦申请就不再还给系统. 因此我们需要把系统的malloc() 和 free() 直接封装了给Go调用, 通过 CGO 可以简单实现, 如下:

package cmem

//include <stdlib.h>
import "C"
import "unsafe"

func Alloc(size uintptr) *byte {
    return (*byte)(C.malloc(_Ctypedef_size_t(size)))
}

func Free(ptr *byte) {
    C.free(unsafe.Pointer(ptr))
}

在需要使用手动分配内存的地方:

        //item.Body = make([]byte, length)
        item.alloc = cmem.Alloc(uintptr(length))
        item.Body = (*[1 << 30]byte)(unsafe.Pointer(item.alloc))[:length]
        (*reflect.SliceHeader)(unsafe.Pointer(&item.Body)).Cap = length

一旦临时对象使用完毕, 可以立即释放内存:

        if item.alloc != nil {
            cmem.Free(item.alloc)
            item.alloc = nil
        }

另外, 为了防止内存泄露(某些情况下漏了主动是否内存), 可以使用runtime的Finalize机制来释放内存:

            runtime.SetFinalizer(item, func(item *Item) {
                if item.alloc != nil {
                    cmem.Free(item.alloc)
                    item.alloc = nil
                }
            })

通过这种简单策略, 可以大大减少这种大的临时对象对内存的消耗, Proxy 在连续运行几天后内存也稳定在 200-300M 左右, 即使短时间内内存消耗上升, 之后如果访问压力下降, 内存使用量也会降下来.

转载于:https://my.oschina.net/leonardtang/blog/882428

相关文章:

依赖倒转原则(Dependency Inversion Principle,DIP)

前面两篇图文介绍了“开闭原则”和“里氏替换原则”。开发出对扩展开放&#xff0c;对修改封闭的系统是程序员的目标&#xff0c;而今天所介绍的“依赖倒转原则”正是实现这一目标的途径之一&#xff0c;而“里氏替换原则”为这一途径提供了保证。大家或许发现&#xff0c;我写…

细说浏览器特性检测(2)-通用事件检测

在上一篇中介绍了jQuery1.4版本新增的几个浏览器特性检测方案和具体的目的&#xff0c;本文将以事件为中心&#xff0c;介绍一个较为完整、通用的事件检测方案。 事件检测&#xff0c;即检测某一事件在不同的浏览器中是否存在&#xff08;可用&#xff09;&#xff0c;这在编写…

robot简单功能测试脚本设计(例子)

以学生管理系统的添加一个学生信息为例子页面对象&#xff1a;editbox&#xff08;姓名&#xff09;,button&#xff08;添加&#xff09;数据要求&#xff1a;1 姓名不能为空2 姓名不能重复程序结构1 点button&#xff0c;弹出对话框“姓名不能为空”2 输入姓名&#xff0c;点…

里氏替换原则(Liskov Substitution Principle,LSP)

昨天图文介绍了软件设计的一个基本原则“开闭原则”&#xff0c;而“开闭原则”的核心就是通过抽象把需求变化进行隔离&#xff0c;这种想法可以通过“里氏替换原则”进行保证。理解“里氏替换原则”也是理解面向对象中“运行时多态”的关键。希望大家仔细体会。

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

在IIS7里配置 ISAPI&#xff0c;运行dll程序&#xff0c;总提示下载dll&#xff0c;只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序&#xff0c;设为“true"即可。

MySQL数据库高可用集群搭建-PXC集群部署

Percona XtraDB Cluster&#xff08;下文简称PXC集群&#xff09;提供了MySQL高可用的一种实现方法。集群是有节点组成的&#xff0c;推荐配置至少3个节点&#xff0c;但是也可以运行在2个节点上。 PXC原理描述&#xff1a; 分布式系统的CAP理论&#xff1a; C&#xff1a;一致…

搭建Jupyter学习环境

python notebook是一个基于浏览器的python数据分析工具&#xff0c;使用起来非常方便&#xff0c;具有极强的交互方式和富文本的展示效果。jupyter是它的升级版&#xff0c;它的安装也非常方便&#xff0c;一般Anaconda安装包中会自带。安装好以后直接输入jupyter notebook便可…

[转贴]2006十大经典语句

1. 骑白马的不一定是王子&#xff0c;他可能是唐僧&#xff1b; 2. 带翅膀的也不一定是天使&#xff0c;他可能是鸟人。 3. 站的更高&#xff0c;尿的更远。 4. 穿别人的鞋&#xff0c;走自己的路&#xff0c;让他们找去吧&#xff0c; 5. 我不是随便的人。我随便起来不是人 6.…

开放-封闭原则(The Open-Closed Principle,OCP)

自己设计的软件系统“易于维护”、“扩展性好”、“可重用”、“具有灵活性”&#xff0c;这是每位程序员所追求的目标。“开闭原则”为我们指明了方向&#xff0c;即我们所设计的软件尽量满足“开闭原则–对扩展开放&#xff0c;对修改关闭”&#xff0c;这样就能降低需求不断…

Interesting visualization tools for profiling.

Interesting visualization tools for profiling. http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/ http://dtrace.org/blogs/brendan/2013/07/01/detecting-outliers/转载于:https://www.cnblogs.com/kungfupanda/p/3245651.html

javascript网页开发 第二章

HTML高级部分 2.1. 表格标签 2.1.1 <table></table> Bgcolor 设置表格的背景色 Border 设置边框的宽度 Bordercolor 设置边框的颜色 Bordercolorlight 设置边框明亮部分的颜色 Bordercolordark 设置边框昏暗部分的颜色 Cellspacing 设置单元格之间的间隔大小 Cel…

ORACLE JET BASIC TABLE

转载于:https://blog.51cto.com/feitai/1917581

Visual Studio UML Use Case Diagram(1)

前几天我们介绍了Visual Studio UML Activity Diagram&#xff0c;今天我们介绍Visual Studio UML Use Case Diagram的内容。通常RUP按照动态划分&#xff0c;分为周期、阶段、里程碑、迭代&#xff0c;按照静态划分&#xff0c;分为角色、制品、工作流、活动&#xff0c;在Wor…

可以左右移动多选下拉列表的javaScipt(可以兼容IE和firefox)

自己在项目业余时间总结了一份可以左右移动&#xff08;Add和remove&#xff09;多选下拉列表的javaScipt,可以兼容IE和firefox,并且经过测试&#xff0c;只是代码略显臃肿&#xff0c;希望各位网友参考后给一些指点&#xff0c;特别是在简化代码方面。我在让其兼容 firefox很是…

OLAP和OLTP的区别(基础知识)

联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的&#xff0c;他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响&#xff0c;OLAP作为一类产品同联机事务处理 (OLTP) 明显区分开来。当今的数据处理大致可以分成两大类&#xff1a;联机事务…

如何让phpmyadmin输入密码再进入

分类&#xff1a;wamp对于很多不熟悉PHP环境安装的朋友来说&#xff0c;用集成环境可以更快的上手&#xff0c;更方便的搭建PHP的运行环境&#xff0c;但是&#xff0c;WAMP的集成环境仅仅是将底层基础工作做好了&#xff0c;有些个别关键的配置操作并没有集成到环境安装中&…

Visual Studio UML Use Case Diagram(2)

Use Case Model是捕获用户需求确定系统边界最流行的方法。Use Case Model由两部分组成Use Case Diagram和Use Case Specification&#xff0c;对于不方便描述的部分可以放在Supplementary Specification中&#xff0c;通过Glossary统一大家的用词规范。昨天我们介绍了Visual St…

Delphi下利用WinIo模拟鼠标键盘详解

本文最早在编程论坛上发表&#xff0c;文章地址&#xff1a;http://programbbs.com/bbs/view12-17207-1.htm&#xff0c;相关文件可以在上述地址的页面中下载。转载时请注明出处。 前言 一日发现SendInput对某程序居然无效&#xff0c;无奈只好开始研究WinIo。上网查了很多资料…

在vs2005中使用Jmail发送邮件问题

jmail.Message Jmail new jmail.Message(); DateTime t DateTime.Now; String Subject " From EMail .net"; String body "你好科学12:15"; String FromEmail "jsyxo163.com"; String ToEmail…

nginx学习之静态内容篇(五)

1.根目录和索引文件 server {root /www/data;location / {}location /images/ {}location ~ \.(mp3|mp4) {root /www/media;} } root指令能放置的位置是&#xff1a;http&#xff0c;server&#xff0c;location。 上面的意思是&#xff1a;我所有的location定义都是基于根目录…

Modeling System Behavior with Use Case(1)

Modeling System Behavior with Use case 我们分为三个部分进行介绍&#xff0c;主要内容包括&#xff1a;需求简介、Use Case Model&#xff08;Use Case Diagram、Use Case Specification&#xff09;、Supplimentary Specification和Glossary&#xff0c;这部分内容是开发过…

matlab练习程序(高斯牛顿法最优化)

计算步骤如下&#xff1a; 图片来自《视觉slam十四讲》6.2.2节。 下面使用书中的练习yexp(a*x^2b*xc)w这个模型验证一下&#xff0c;其中w为噪声&#xff0c;a、b、c为待解算系数。 代码如下&#xff1a; clear all; close all; clc;a1;b2;c1; %待求解的系数x(0:0…

和Office一起做减肥操

随着微软公司的不断开发&#xff0c;Microsoft Office这款大家熟悉的软件真是越来越好用。可是随着版本的更新&#xff0c;软件的身材却越来越“肥胖”&#xff0c;于是很多朋友总想知道如何给它们“减肥”&#xff1f;今天&#xff0c;我们就说一说如何为Office2003减肥吧&…

codevs——1220 数字三角形(棋盘DP)

时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题解题目描述 Description如图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择向左走或得向右走&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的值最大。 输入描述 …

Modeling System Behavior with Use Case(2)

这是Modeling System Behavior with Use Case的第二部分&#xff0c;本图文首先介绍Use Case Model&#xff0c;然后介绍Actor以及Actor之间的关系&#xff0c;Use Case以及Use Case之间的关系&#xff0c;最后介绍Actor与Use Case之间的关系。

【Python】keras卷积神经网络识别mnist

卷积神经网络的结构我随意设了一个。 结构大概是下面这个样子&#xff1a; 代码如下&#xff1a; import numpy as np from keras.preprocessing import image from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Activation from keras.…

IIS安全机制基础

IIS (Internet Information Server)作为当今流行的Web服务器之一&#xff0c;提供了强大的Internet和Intranet服务功能。如何加强IIS的安全机制&#xff0c;建立高安全性能的可靠的Web服务器&#xff0c;已成为网络管理的重要组成部分。 以Windows NT的安全机制为基础 …

CLion 2017 注册码

注册码使用时间2017-2018 CNEKJPQZEX-eyJsaWNlbnNlSWQiOiJDTkVLSlBRWkVYIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb…

Modeling System Behavior with Use Case(3)

这是Modeling System Behavior with Use Case的最后一个部分&#xff0c;主要介绍Use Case Specification、Supplementary Specification和Glossary。今天华电时断时续停电&#xff0c;导致早晨所做的工作丢失&#xff0c;很是难过&#xff0c;发完这个图文&#xff0c;我继续代…

2019最新版本的PanDownload纯净版,网盘满速下载和搜索神器,追剧和动漫新番必不可少的下载工具【亲测有效】

PanDownload是百度网盘的第三方下载神器&#xff0c;它支持快速搜索功能&#xff0c;快速找到你想要的东西&#xff0c;还支持满速下载&#xff0c;可谓是不可多得的下载神器。 下载地址&#xff1a;http://t.cn/EobUOTS 城通网盘下载地址&#xff1a;https://u20150046.ctfi…