精华内容
参与话题
问答
  • lua内存管理

    2020-09-10 10:22:32
    lua内存管理: 众所周知,lua是用纯c写的,所以lua中的内存管理,也就是用c方式对内存的管理。 /* ** About the realloc function: ** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); **...

    本篇文章,主要探讨一下lua中的内存管理(涉及到的文件 lmem.c,lauxlib.c )。

    lua内存管理:

    众所周知,lua是用纯c写的,所以lua中的内存管理,也就是用c方式对内存的管理。

    /*

    ** About the realloc function:

    ** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);

    ** (`osize’ is the old size, `nsize’ is the new size)

    **

    ** Lua ensures that (ptr == NULL) iff (osize == 0).

    **

    ** * frealloc(ud, NULL, 0, x) creates a new block of size `x’

    **

    ** * frealloc(ud, p, x, 0) frees the block `p’

    ** (in this specific case, frealloc must return NULL).

    ** particularly, frealloc(ud, NULL, 0, 0) does nothing

    ** (which is equivalent to free(NULL) in ANSI C)

    **

    ** frealloc returns NULL if it cannot create or reallocate the area

    ** (any reallocation to an equal or smaller size cannot fail!)

    */

    注释中写的比较清楚,使用 void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); 接口来释放分配内存,释放和分配在同一个函数中完成,也可以只释放,或只分配,也可即释放又分配。

    — 源码:

    /*

    ** generic allocation routine.

    */

    void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {

    global_State *g = G(L);

    block = (*g->frealloc)(g->ud, block, osize, nsize);

    g->totalbytes = (g->totalbytes – osize) + nsize;

    return block;

    }

    把源码中断言去掉,便于代码分析:

    global_State *g = …,通过当前栈指针L获得全局栈指针g,栈指针,以及全局栈指针,将在后续的文章中说明;

    block = (*g->frealloc)(),通过frealloc接口释放block指针指向大小为osize的内存,申请nsize大小的内存,且用block指针指向,这里把要释放的内存和新申请的内存共享一个指针;

    g->totalbytes = …, 刷新全局内存计数;

    return block, 返回指向新申请的内存的指针;

    内存管理的其他宏定义,如:luaM_reallocv,luaM_freemem,luaM_free,luaM_malloc,luaM_new等等,只是把luaM_realloc_接口再次封装了一下,比较容易理解。

    frealloc真面目

    在上面的分析中,只知道用frealloc接口释放分配内存,下面让我们来一览它的真面目。

    static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {

    (void)ud;

    (void)osize;

    if (nsize == 0) {

    free(ptr);

    return NULL;

    }

    else

    return realloc(ptr, nsize);

    }

    这块代码很简洁,当nsize==0,表示只释放ptr指向的内存,反之,则realloc一下ptr指向的内存,free,realloc都是c提供的内存操作API。

    展开全文
  • Lua内存管理

    2020-11-16 16:11:51
    Lua内存管理 lua允许用户自定义内存管理器,也可以使用默认的内存管理器l_alloc l_alloc函数实际是调用C标准库中的realloc函数进行分配内存。分配内存使用luaM_realloc_函数,释放内存使用luaM_free_函数,都是调用l...

    Lua内存管理

    lua允许用户自定义内存管理器,也可以使用默认的内存管理器l_alloc
    l_alloc函数实际是调用C标准库中的realloc函数进行分配内存。分配内存使用luaM_realloc_函数,释放内存使用luaM_free_函数,都是调用l_alloc,只是nsize的值不一样,为0时释放内存
    在这里插入图片描述
    ud:用户可以在自定义内存管理器中,设置内存管理器在不同的堆上,避免线程安全问题,可以让内存管理器工作更高效
    ptr:返回分配的内存指针,如果nsize为0,返回NULL
    osize:给出内存块的原始大小,内存管理器释放内存的时候直接指定内存的大小,不必在内存前面加一个cookie来记录内存的大小,提高内存的使用效率
    nsize:分配内存的大小,如果nsize为0,会释放原来的内存

    展开全文
  • Lua内存管理

    千次阅读 2015-01-19 17:00:39
    Lua 要求用户给出一个内存管理函数,在 Lua创建虚拟机的时候传入。。  它利用 C 标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理器的语义。  ...

    Lua  一个,Lua入。了一个,。 

    1:    Lua一个,reallocC 的reallocnsize = 0 ,。 

    2:  和,Lua 出内始大。 

    3:  为Lua一个,大多,。 

    4:  free realloc 大多块在,了一个cookie ,寸存面 

    5:    Lua,们不,使存 


    6: ,一个针 ud  ,线线,效 

    7: 一个在Lua5.2 当Luaptr = NULL,osize,一个什么,对它一些。 

    Lua使了一:可变宏定lmem.h中


    一个部API luaM_realloc_,用 

    在 lmem.c global_State 不仅仅,,Lua过realloc,,。 


    从代,luaM_realloc_osizensize(GCdebt),GC 。 

    lmem.c一个部API luaM_growaux_,可变,。 



    展开全文
  • lua内存管理:由于lua中有内存回收机制,所以本质上说lua与C/C++中的内存泄漏是不一样的,lua中有GC,理论上说是不会有内存泄漏的。当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用...

    lua内存管理:由于lua中有内存回收机制,所以本质上说lua与C/C++中的内存泄漏是不一样的,lua中有GC,理论上说是不会有内存泄漏的。当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用,那么就不会把这个对象collect,这个对象就没有被GC,所以lua中的内存泄漏是指已经没有使用,但是外部依然还存在引用的对象。

    Lua的GC算法使用的所谓的“Mark And Sweep”算法,简单理解,这个算法GC分为两个阶段,一个是标记(mark)阶段,这一阶段将所有系统中的引用的对象都逐一标记,而在清理(Sweep)阶段,把在mark阶段没有被标记的数据删除。

     

    优化方法:1.尽量少使用全局变量,由于Lua默认是全局变量,所以很容易造成内存泄漏,尽量使用local限定。

    2.在可能内存泄漏的地方先调用collectgarbage(“count”)获取内存的最初使用,然后在函数调用后进行collectgarbage(“collect”)收集,并使用collectgarbage(“count”)检测两次内存使用的差。或者手动进行显示的垃圾回收collectgarbage("step")

    3.lua的弱引用__mode(table):因为如果一个table1里面还有一个table2对象,那么即使将这个table2对象赋值为nil,它依然不会被垃圾回收,因为table1还保存着这个对象的引用,而显然这部分的引用是没有用的。为了告诉GC,这一部分引用是没有必要的,所以需要将其标记为弱引用,以方便GC对其进行回收。

    通过设置该表的元方法__model 为“k”或者是“v”,为“k”即可说明该表的key所引用的表是弱引用 ,为“v”说明该表的value所对应的表是弱引用。

    可以参考博文:https://blog.csdn.net/jiumengdz/article/details/88427895

     

    展开全文
  • Cocos2d-lua 内存管理

    千次阅读 2017-08-29 17:08:40
    Cocos2d-x引擎中的对象被创建后,使用retain和release来管理对象的生命周期,结合AutoreleasePool的使用,达到了对象生命周期自动管理的目的。 一个Lua对象的销毁,其实是AutoreleasePool先把该C++对象释放,然后C++...
  • 首先要了解lua的垃圾回收机制,lua中的垃圾回收机制是每隔一段时间清除不再被引用的对象,也就是说一个对象如果不再被使用就会在下次的gc中被回收掉,这个不需要我们管理,是lua中的自动回收机制。接下来看一下c++...
  • lua-内存管理~LuaEngine() { if(lua_state) { lua_close(m_pstate)//释放 lua_state==null; } }
  • Lua源码阅读二——lua内存管理

    万次阅读 2010-12-16 21:53:00
    距离写的上一篇lua源码阅读,已经一个月了,在这一个月里,除了正常上班之外,业余时间都去玩战神-奥林匹斯...   本篇文章,主要探讨一下lua中的内存管理(涉及到的文件 lmem.c,lauxlib.c )。
  • Lua内存管理

    2019-10-03 16:59:13
    【前言】 在历史长河中,各种各样的新语言,总是伴随着我们...而对于Lua的学习,前面几个模块我都已经总结完毕了,而今天这篇文章主要是总结Lua中的内存管理Lua在两个层面提供了对这些定制的支持。在较低层面...
  • C#和Lua内存管理

    2020-03-07 15:08:50
    C#中数据类型分为值类型和引用类型,值类型存储在栈上,在程序运行一段时间后栈上内存会自动释放,无需CLR管理,引用类型存储在堆上,需要CLR管理并且通过GC来减少内存负担。 C#垃圾回收的过程如下: 1.暂停进程中...
  • lua 内存回收

    2017-12-29 14:29:07
    Lua 提供了以下函数collectgarbage ([opt [, arg]])用来控制自动内存管理: 1, collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能: 2, collectgarbage("count"): ...
  • Lua内存泄露检测工具LuaMonitor下载.rar 对于Lua的性能检测提供良好的视图分析 可以获取当前内存图,方便对应项目的内存管理 可以获取热点函数相关信息
  • Lua内存管理和释放的理解

    万次阅读 2018-01-28 13:28:39
    Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的不同,它是由于代码执行所装载...
  • <div><p>操作如下: 1.使用master分支的例子工程&#...看提示像是lua内存管理上的bug。有时间的话能否处理一下这个问题?非常感谢。</p><p>该提问来源于开源项目:asqbtcupid/unreal.lua</p></div>
  • lua C++对象内存管理

    千次阅读 2016-04-19 16:52:09
    一般情况下,当lua里对c++对象的引用变量可以被垃圾回收时,tolua++只是简单的释放userdata占用的4字节指针地址内存。但是也可以通过绑定或者代码指定的方式,让tolua++真正释放对象所占内存。 绑定的方式,是指...
  • Lua的函数有多种使用方法 ,因为Lua内存遵循C内存管理 一、闭合函数:”非局部变量生命周期受影响” 闭合函数: 函数A中包含另一个函数B,函数B中使用了非局部变量(函数中A的局部变量),构成闭合函数 影响:延长...
  • -内存池 ... 这篇文章提供了内存池的设计结构以及基本思路,简单来说内存池...一次性分配一大块内存,并通过链表管理之。 -今天为lua中的内存问题纠结了蛮久。 情景大概是在lua脚本中进行update帧更新,但即便是print...
  • Lua内存泄露情况举例

    千次阅读 2016-05-30 11:36:15
    1、在多次刷新的情况下不停的 新建table; 如 Update()是一个不停被回调的函数,那么在Update里, ...2、长字符串,虽然Lua虚拟机不会显示这块内存,但任务管理器还是会产生巨大的消耗。 如: local

空空如也

1 2 3 4 5 ... 16
收藏数 316
精华内容 126
关键字:

lua内存管理