一、目的在《LwIP系列--内存管理(堆内存)详解》中我们详细介绍了LwIP中内存堆的实现原理,本篇我们介绍LwIP中内存池的实现细节。在LwIP源码中为了满足特定内存分配的需要以及优化内存占用制定了各种尺寸大小的内存池(每种内存池管理的内存块大小固定)。内存池分配方案的特点:每个内存块大小固定(由于根据大小从不同内存池中获取内存块,故内存堆的内存碎片得到优化)不存在内存碎片分配时间相对固定因为L
缓存池基本写法---------------------------------
-- Lua Class对象池
-- 自己管理好池的清空时机
---------------------------------
ObjectPool = Class( "ObjectPool" );
-- 构造函数,传需实例化的对象
function ObjectPool:Ctor( class )
se
转载
2024-04-13 12:47:05
35阅读
标记和清扫Lua是一门自动内存管理的语言,它使用的是经典的标记和清扫算法。这个算法的原理其实非常简单,在我们的编程实践中或多或少都有类似的做法,一个理想的实现是这样的:明确对象模型和关系:统一对象模型,比如Lua所有类型的对象都统一为TValue。所有动态分配的对象串连成一个链表(或多个)。程序中有少数几个根集对象,比如Lua里的注册表,主线程等,这些根集对象再去引用其他对象,由此展开成对象的关系
转载
2024-06-27 20:34:58
57阅读
由于目前正在负责的项目是一个二次开发项目,而且留给我们的代码质量实在让人无力吐槽,所以遇到了不少大大小小的坑,好在慢慢都淌过去了。最近就遇到了一个内存泄漏的问题,泄漏发生在lua里,项目代码里以前的开发团队留下了检测泄漏的代码,但也仅限于此。由于代码量庞大,所以想从逻辑上梳理清楚哪里的引用没干掉导致了内存泄漏几乎就是大海捞针。好在解决的过程比较顺利,这篇文章就来谈一谈Lua中如何解决内存泄漏的问题
转载
2024-04-24 09:13:20
86阅读
假定你要拼接很多个小的字符串为一个大的字符串,比如,从一个文件中逐行读入字符串。你可能写出下面这样的代码: 尽管这段代码看上去很正常,但在Lua中他的效率极低,在处理大文件的时候,你会明显看到很慢,例如,需要花大概1分钟读取350KB的文件。(这就是为什么Lua专门提供了io.read(*all)选项,读取同样的文件只需要0.02s)为什么这样呢?Lua使用真正的垃圾收集算法,但他发现程序使用太多
转载
2024-03-19 12:46:35
223阅读
上周UWA发表了一片博文Lua性能优化—Lua内存优化作者分享了在unity中lua使用的不少干货,文中提到两个lua的小插件,一个是内存检查工具Snapshot,一个是性能分析工具LuaProfiler。 正好上周笔者也涉猎到了这方面的实践上,作为记录我将操作步骤分享下。 1.首先Snapshot是云风大大曾经的一篇博文提到的工具一个 Lua 内存泄露检查工具 2.其次Profiler也是
转载
2024-03-22 20:07:28
135阅读
Lua会造成内存泄露的表征分析: #因素一:(实例型)实体资源的创建持有者和调用者,相互之间如果太过信任,那么对调用者就会形成过高的要求,创建者可以让任意的调用者进行任意的create,调用者消费后以为创建者会管理(销毁),但其实并非如此,比如有这样一个实体管理器xxxManager,它有接口createXXX/removeXXX, 那么,创建和销毁的权利都丢给了调用者,如果调用者光creat
转载
2024-04-15 11:31:58
95阅读
这两天剖析了一下socket.lua,整体不是很难,主要是数据缓冲区的实现需要好好分析一下。这里读写数据也是用到了缓冲池的思想,为了更加直观的说明代码,还有方便测试,我去掉lua代码,把核心接口直接用C++实现了一遍:#include <stdio.h>
#include <string.h>
#include <vector>
using std::vecto
转载
2024-02-27 14:59:34
183阅读
作者:敏捷小菜
本文从Lua语法的角度来介绍Lua内存出现泄露的问题;
1、在多次刷新的情况下不停的 新建table;
如 Update()是一个不停被回调的函数,那么在Update里,
function Update()
local t = {};--创建表,内存泄露,游戏常见到
end
转载
2024-03-23 12:39:14
147阅读
一、 概念 协同程序提供一种协作式的多线程。每个协同程序都等于是一个线程。一对yield-resume可以将执行权在不同线程之间切换。然而,协同程序与常规的多线程的不同之处在于,协同程序是非抢先式的。就是说,当一个协同程序在运行时,是无法从外部停止它的。只有当协同程序显示地要求挂起时(调用yield),它才会停止。对于有些应用而言,这没有问题,而对于另外一些应用则可能无法接受这种情况。当
愿打开此篇对你有所帮助。
原创
2022-01-15 17:12:10
261阅读
愿打开此篇对你有所帮助。
原创
2021-10-11 16:26:43
3128阅读
在设计一个内存池时,首先要对内存池的存储数据部分的构建做一个大概的规划。 因为是动态申请内存,没有办法预计将来正在运行的程序究竟会需要多大的内存空间,因此在内存池的设计上要预留空间,未来防止盲目的使用过大空间,采用的方法就是用多个内存块组成一个内存池,第一次分配的时时,先申请一个内存块,当程序不够用的时候,再向系统申请
转载
2024-04-17 17:39:32
46阅读
为什么要引入内存池算法?我们知道C/C++ 语言中通过 malloc 调用 sbrk 和 mmap 这两个系统调用,向操作系统申请堆内存。但是,sbrk 和 mmap 这两个系统调用分配内存效率比较低,因为,执行系统调用是要进入内核态的,这样内核态又要转向用户态,运行态的切换会耗费不少时间。至于为什么执行系统调用是要进入内核态?,可以参考我的这篇文章:Linux 系统调用的本质
为了解决这个问题,
转载
2023-09-28 21:14:33
81阅读
我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢?内存池技术带你走进这个问题的殿堂。内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。优势:1·效率快,无需调用
转载
2024-06-13 19:00:49
73阅读
C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。malloc/free、new/delete的缺点 1.调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可
原创
2021-09-28 14:56:22
613阅读
参考链接:https://github.com/Winter-Win/ConcurrentMemoryPool参考链接:https://www.jb51.net/article/217288.htm参考链接:https://www.jb51.net/article/223461.htm参考链接:https://zhuanlan.zhihu.com/p/523216209后续看:1、池化技术池化技术
转载
2024-05-16 23:03:40
80阅读
C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。 malloc/free、new/delete的缺点 1.调用malloc/new,系统需要根据“最先匹配”、“最优匹配”...
转载
2020-06-13 04:55:00
160阅读
2评论
前言最近做的手游项目(Unity+tolua架构)快接近尾声了,功能差不多齐备之后开始对各种技术指标进行优化。Unity自带的Profiler能对C#的Cpu和内存使用状况进行比较好的分析,但是无法涵盖lua部分,很多人可能跟我一样,对lua部分的优化觉得无从下手。本人在网上搜了很多工具之后发现了这个很实用的工具,能够对内存消耗情况和lua和mono的GC进行很好的监测,废话不多说,一起来看。安装
转载
2024-03-07 10:47:59
307阅读
lua内存泄漏查证
本文主要介绍某项目脚本(lua)部分内存泄漏的查证与处理过程,希望对大家有点
帮助。需要说明的是,lua本身并不存在真正的内存泄漏,只是因为使用上面的原
因导致无法gc,从而导致逻辑上的泄漏:)。
参考GCObject的声明可以发现,lua中的复杂数据类型变量的传递都是基
于引用的。当lua从根开始gc扫描的时候,只要还有一个地方有对此变量的引用,那
么
转载
2024-04-17 10:48:37
47阅读